如何修改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
相关产品推荐
相关产品推荐

