如何修正代码以找出1~max范围内未出现在无序数组中的数字?
修正方案:找出1~max中缺失的数字
问题分析
你的代码当前是遍历无序数组A,对比1max的有序数组B,找到匹配项就打印,因此输出的是**存在的数字**。要实现打印**缺失数字**的需求,需要反转检查逻辑:遍历1max的所有数字,判断每个数字是否在数组A中,不存在则打印。
基于原代码的修改版本
直接调整循环逻辑和判断条件,保持原有数组对比的思路:
public class Test { public static void main(String[] args) { // 最大数字范围 int max = 5; // 无序目标数组 int[] A = {1,2,3,5}; // 创建1~max的有序数组 int[] B = new int[max]; int num = 1; for (int i = 0; i < max; i++) { B[i] = num; num++; } // 检查逻辑:遍历有序数组B,判断每个数字是否在A中存在 for (int j = 0; j < B.length; j++) { boolean isExist = false; // 遍历A查找当前B中的数字 for (int i = 0; i < A.length; i++) { if (B[j] == A[i]) { isExist = true; break; // 找到匹配项后直接终止内层循环,提升效率 } } // 若不存在则打印 if (!isExist) { System.out.println(B[j]); } } } }
更高效的优化方案
当max或数组A的长度较大时,双重循环的时间复杂度较高(O(n*max))。可以使用HashSet存储数组A的元素,利用集合的O(1)查找特性优化性能:
import java.util.HashSet; import java.util.Set; public class Test { public static void main(String[] args) { int max = 5; int[] A = {1,2,3,5}; // 将数组A的元素存入HashSet Set<Integer> numSet = new HashSet<>(); for (int num : A) { numSet.add(num); } // 遍历1~max,检查每个数字是否在集合中 for (int i = 1; i <= max; i++) { if (!numSet.contains(i)) { System.out.println(i); } } } }
输出结果
两种方案执行后都会输出:4,符合打印缺失数字的需求。
内容的提问来源于stack exchange,提问作者MHD ALHABEB ALSHALAH
相关产品推荐
相关产品推荐

