【Java每日一题】1.和数最大操作
题目难度:简单
主要提升:(1)for循环思想(2)数组基本操作(3)问题拆解能力。
一、题目描述:
给一个整数数组 nums ,如果 nums 至少包含 2 个元素,你可以执行以下操作:
选择 nums 中的前两个元素并将它们删除。
一次操作的分数是被删除元素的和。
在确保所有操作分数相同的前提下,请你求出最多能进行多少次操作。
返回按照上述要 最多可以进行的操作次数。
二、示例:
示例 1:
输入:nums = [3,2,1,4,5]
输出:2
解释:我们执行以下操作:
– 删除前两个元素,分数为 3 + 2 = 5 ,nums = [1,4,5] 。
– 删除前两个元素,分数为 1 + 4 = 5 ,nums = [5] 。
由于只剩下 1 个元素,我们无法继续进行任何操作。
示例 2:
输入:nums = [3,2,6,1,4]
输出:1
解释:我们执行以下操作:
– 删除前两个元素,分数为 3 + 2 = 5 ,nums = [6,1,4] 。
由于下一次操作的分数与前一次不相等,我们无法继续进行任何操作。
三、思路详解:
对于这个题目,很容易就被数组删除的操作所迷惑,但是实际上,我们只用关注程序所需要输出的值,输出所需要的计算其实并不需要有删除的操作,因此我们可以看做使用0索引值与1索引值的和与数组内后续两个两个数的和的比较,只需要对循环开始定义为2即可进行计算。我将写两种解答。
四、代码(我写了两种解法)
代码1:
public class Daily1 {
public static void main(String[] args) {
int[] nums = {3,2,1,3,5,0,1,4};
System.out.println(maxTime(nums));
}
public static int maxTime(int[] nums) {
int sum = 0;
int sumTemp = 0;
int Times = 1;
if (nums.length<2){
Times = 0;
}
for (int i = 2; i < nums.length-1; i+=2) {
sum = nums[0] + nums[1];
sumTemp = nums[i] +nums[i+1];
if (sumTemp==sum){
Times++;
}else {
break;
}
}
return Times;
}
}
代码2:
public class MaxOperations {
public int maxOperations(int[] nums) {
if (nums.length < 2) {
return 0;
}
int[] prefixSum = new int[nums.length];
prefixSum[0] = nums[0];
// 计算前缀和
for (int i = 1; i < nums.length; i++) {
prefixSum[i] = prefixSum[i - 1] + nums[i];
}
int maxOperations = 0;
// 遍历所有可能的子数组
for (int i = 0; i < nums.length; i++) {
for (int j = i + 2; j < nums.length; j++) {
// 计算当前子数组的和
int subarraySum = prefixSum[j] - prefixSum[i];
// 如果子数组的和等于前两个元素的和,则更新最大操作次数
if (subarraySum == nums[i] + nums[i + 1]) {
maxOperations = Math.max(maxOperations, j - i);
}
}
}
return maxOperations;
}
public static void main(String[] args) {
MaxOperations solution = new MaxOperations();
// 示例
System.out.println(solution.maxOperations(new int[]{3,2,1,4,5})); // 输出:2
System.out.println(solution.maxOperations(new int[]{3,2,6,1,4})); // 输出:1
}
}
以上就是今天的每日一题,如有问题可以评论区交流讨论。