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

合并数组时for循环未生效,c[]数组无法赋值的原因是什么?

数组合并去重时循环未赋值?这几个坑你肯定踩了!

兄弟,我太懂你这种写了循环却发现数组还是全0的崩溃感了!结合你说的场景——合并两个数组并去重,但循环好像没干活,大概率是这几个常见的坑导致的,咱们一个个捋:

最容易踩的坑:重复判断逻辑错误

你可能在检查元素是否已存在时,遍历了整个初始化后的空数组(比如int数组默认全是0),举个反例:

int[] c = new int[a.length + b.length];
int index = 0;
for (int num : a) {
    boolean exists = false;
    // 错误:遍历了整个c数组,包括未赋值的0元素
    for (int i = 0; i < c.length; i++) {
        if (c[i] == num) {
            exists = true;
            break;
        }
    }
    if (!exists) {
        c[index++] = num;
    }
}

这里未赋值的位置都是0,如果你的原数组里没有0还好,但只要有元素和0不同,判断时会误把“未赋值的0”当成已存在的元素,导致根本不会往c里加值!

正确的做法是只遍历c数组中已经赋值过的部分,也就是到index的位置:

for (int i = 0; i < index; i++) { // 只检查已添加的元素
    if (c[i] == num) {
        exists = true;
        break;
    }
}

第二个坑:循环执行条件写错

比如你可能把循环的起始索引写成了i=1,或者结束条件写成了i <= a.length,导致循环直接没执行。检查一下你的for循环:

  • 遍历数组的正确条件应该是for (int i = 0; i < 数组长度; i++),别把起始或结束值写错了!

第三个坑:索引变量没正确递增

如果你的index变量(用来记录c数组的当前赋值位置)在添加元素后没有index++,那所有元素都会往c[0]里写,后面的位置自然还是0。一定要确保每次成功添加元素后,把索引往后挪一位。

更省心的解决方案:用动态集合替代数组

如果不是必须用数组实现,用List这种动态集合会避开很多数组长度和初始化的坑,代码也更简洁:

public static int[] mergeAndDeduplicate(int[] a, int[] b) {
    List<Integer> tempList = new ArrayList<>();
    
    // 添加a数组元素并去重
    for (int num : a) {
        if (!tempList.contains(num)) {
            tempList.add(num);
        }
    }
    
    // 添加b数组元素并去重
    for (int num : b) {
        if (!tempList.contains(num)) {
            tempList.add(num);
        }
    }
    
    // 转换为int数组返回
    int[] result = new int[tempList.size()];
    for (int i = 0; i < tempList.size(); i++) {
        result[i] = tempList.get(i);
    }
    return result;
}

你可以对照自己的代码,先检查重复判断的遍历范围,再看循环条件和索引变量的处理,应该就能找到问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:32:02