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

如何修改Java代码实现迭代移除数组所有最小值实例并更新长度?

USACO Bronze备考题代码修正

原代码核心问题

  • 循环逻辑错误:用初始数组长度作为循环次数,且k = k + array.length的更新方式完全颠倒,应该将k设为移除后的数组长度
  • 最小值未更新:始终使用初始数组的最小值,没有随着数组变化重新获取当前最小值
  • 冗余方法:countFreq和addX方法未实际发挥作用,属于无效代码
  • 数组引用未更新:每次移除元素后未将新数组赋值给原数组,导致反复操作初始排序数组

修正后的代码

import java.util.Arrays;
import java.util.Scanner;

public class RemoveMinRepeated {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        int[] memory = new int[x];
        
        // 读取输入数组
        for (int i = 0; i < x; i++) {
            memory[i] = sc.nextInt();
        }
        
        Arrays.sort(memory);
        int currentLength = memory.length;
        
        // 循环移除当前最小值,直到数组为空
        while (currentLength > 0) {
            int currentMin = memory[0];
            // 移除所有当前最小值的实例
            memory = removeElements(memory, currentMin);
            currentLength = memory.length;
            // 输出每次移除后的剩余长度
            System.out.println(currentLength);
        }
        
        sc.close();
    }

    // 移除数组中所有等于key的元素,返回新数组
    public static int[] removeElements(int[] arr, int key) {
        int index = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != key) {
                arr[index++] = arr[i];
            }
        }
        return Arrays.copyOf(arr, index);
    }
}

关键修改说明

  • 改用while循环:以数组长度是否大于0作为循环条件,逻辑更清晰,无需提前预估循环次数
  • 动态更新最小值:每次循环都从当前排序后的数组取第一个元素作为最小值,保证每次移除的都是当前数组的最小值
  • 正确更新数组和长度:移除元素后将新数组赋值给memory,并同步更新currentLength
  • 清理冗余代码:删除未使用的countFreq和addX方法,简化代码结构
  • 符合输出要求:每次移除操作后立即输出剩余数组长度,满足题目需要的输出序列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:33:17