【Java每日一题】1.和数最大操作

作者 : admin 本文共1645个字,预计阅读时间需要5分钟 发布时间: 2024-06-8 共4人阅读

题目难度:简单

主要提升:(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
    }
}

以上就是今天的每日一题,如有问题可以评论区交流讨论。

本站无任何商业行为
个人在线分享 » 【Java每日一题】1.和数最大操作
E-->