You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组元素平方和计算遇多最大值递减异常,求技术解决方案

解决数组多最大值时的递减问题

我明白你遇到的坑了——当数组里有多个相同的最大值时,你的当前代码只会死盯着第一个出现的最大值不停减1,其他的最大值元素完全没被处理,导致最终计算的平方和肯定不对,对吧?

咱们先拆解下问题根源:你原来找最大值索引的逻辑,只有当后面的元素严格大于当前最大值时才更新索引,所以多个相同最大值的情况下,索引永远停留在第一个最大值的位置,每次只改它一个,其他最大值纹丝不动。

下面给你两种针对性的解决方案,看哪种更符合你的需求:


方案1:每次循环处理一个最大值(轮流覆盖所有最大值)

如果你希望每次迭代只减一个最大值元素,但要公平地处理所有的最大值(比如这次减第一个,下次减第二个),可以修改逻辑,先收集所有最大值的位置,再按顺序选择处理:

import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;

class NoOvertime {
    public int noOvertime(int no, int[] works) {
        int sum = 0;
        // 改成no>0更直观,代表剩余可执行的操作次数
        while (no > 0) { 
            int max = Arrays.stream(works).max().getAsInt();
            // 收集所有最大值的索引
            List<Integer> maxIndices = new ArrayList<>();
            for (int i = 0; i < works.length; i++) {
                if (works[i] == max) {
                    maxIndices.add(i);
                }
            }
            // 每次选择第一个最大值索引减1(也可以随机选,按需调整)
            int targetIndex = maxIndices.get(0);
            works[targetIndex]--;
            no--;
        }
        // 计算平方和
        for (int num : works) {
            sum += num * num;
        }
        return sum;
    }

    public static void main(String[] args) {
        NoOvertime solution = new NoOvertime();
        int[] works = {3, 3};
        System.out.println(solution.noOvertime(2, works)); // 输出 8(2²+2²)
    }
}

这个方案每次会重新扫描所有最大值的位置,确保不会一直盯着同一个元素减1,能公平处理所有峰值。


方案2:每次循环处理所有最大值

如果你希望每次迭代把数组中所有的最大值元素都减1(比如一次操作抹平所有峰值),逻辑会更简单,直接遍历数组批量处理:

import java.util.Arrays;

class NoOvertime {
    public int noOvertime(int no, int[] works) {
        int sum = 0;
        while (no > 0) {
            int max = Arrays.stream(works).max().getAsInt();
            // 遍历数组,把所有等于最大值的元素减1
            for (int i = 0; i < works.length; i++) {
                if (works[i] == max) {
                    works[i]--;
                }
            }
            no--;
        }
        // 计算平方和
        for (int num : works) {
            sum += num * num;
        }
        return sum;
    }

    public static void main(String[] args) {
        NoOvertime solution = new NoOvertime();
        int[] works = {3, 3};
        System.out.println(solution.noOvertime(1, works)); // 输出 8(2²+2²)
    }
}

这个方案适合需要一次性降低所有峰值的场景,效率也更高,不需要额外收集索引。

另外提个小细节:你的原代码while条件写的是no>-1,改成no>0会更直观,因为no代表的是可执行的操作次数,每次循环消耗一次,直到次数用完为止。

内容的提问来源于stack exchange,提问作者NSN7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:23:53