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

如何删除数组中的0值并收缩数组?添加指定收缩函数的技术咨询

解决数组删除0值及条件触发收缩的问题

1. 基础操作:删除数组中的0值并实现数组收缩

不管用什么语言,核心思路都是遍历数组筛选出非0元素,再通过生成新数组或原地修改的方式完成收缩。这里用两种常用语言给出具体实现:

JavaScript 实现

如果不介意生成新数组,用filter方法最简洁:

let arr = [1, 0, 3, 0, 5, 0];
// 直接筛选出非0元素,得到收缩后的数组
arr = arr.filter(item => item !== 0);
console.log(arr); // 输出: [1, 3, 5]

要是需要在原数组上原地修改(减少内存开销),可以用双指针法:

let arr = [1, 0, 3, 0, 5, 0];
let validIndex = 0;
for (let i = 0; i < arr.length; i++) {
  if (arr[i] !== 0) {
    arr[validIndex] = arr[i];
    validIndex++;
  }
}
// 截断数组到有效元素的长度
arr.length = validIndex;
console.log(arr); // 输出: [1, 3, 5]

Java 实现

Java数组长度固定,推荐用ArrayList来自动处理收缩,最后再转回数组:

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

public class ArrayShrinkDemo {
    public static void main(String[] args) {
        Integer[] arr = {1, 0, 3, 0, 5, 0};
        List<Integer> nonZeroList = new ArrayList<>();
        for (Integer num : arr) {
            if (num != 0) {
                nonZeroList.add(num);
            }
        }
        // 转换为收缩后的数组
        Integer[] shrunkArr = nonZeroList.toArray(new Integer[0]);
        System.out.println(Arrays.toString(shrunkArr)); // 输出: [1, 3, 5]
    }
}

2. 添加条件触发的收缩函数

要实现当数组中0的数量超过5个时自动删除0并移位的功能,只需要在基础收缩逻辑前加一层统计判断即可:

JavaScript 示例函数

function shrinkArrayOnZeroThreshold(arr) {
    // 先统计数组中0的数量
    const zeroCount = arr.filter(item => item === 0).length;
    if (zeroCount > 5) {
        // 满足条件时执行收缩,这里用原地修改的方式
        let validIndex = 0;
        for (let i = 0; i < arr.length; i++) {
            if (arr[i] !== 0) {
                arr[validIndex] = arr[i];
                validIndex++;
            }
        }
        arr.length = validIndex;
        return arr;
    }
    // 不满足条件则返回原数组
    return arr;
}

// 测试用例
let testArr1 = [0,0,0,0,0,0,1,2,3]; // 6个0,触发收缩
testArr1 = shrinkArrayOnZeroThreshold(testArr1);
console.log(testArr1); // 输出: [1,2,3]

let testArr2 = [0,0,0,4,5]; // 3个0,不触发收缩
testArr2 = shrinkArrayOnZeroThreshold(testArr2);
console.log(testArr2); // 输出: [0,0,0,4,5]

Java 示例函数

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

public class ConditionalShrinkDemo {
    public static Integer[] shrinkIfZeroExceedsFive(Integer[] arr) {
        int zeroCount = 0;
        // 统计0的数量
        for (Integer num : arr) {
            if (num == 0) {
                zeroCount++;
            }
        }
        if (zeroCount > 5) {
            List<Integer> nonZeroList = new ArrayList<>();
            for (Integer num : arr) {
                if (num != 0) {
                    nonZeroList.add(num);
                }
            }
            return nonZeroList.toArray(new Integer[0]);
        }
        // 不满足条件返回原数组
        return arr;
    }

    public static void main(String[] args) {
        Integer[] testArr1 = {0,0,0,0,0,0,6,7,8};
        testArr1 = shrinkIfZeroExceedsFive(testArr1);
        System.out.println(Arrays.toString(testArr1)); // 输出: [6,7,8]

        Integer[] testArr2 = {0,0,1,2,3};
        testArr2 = shrinkIfZeroExceedsFive(testArr2);
        System.out.println(Arrays.toString(testArr2)); // 输出: [0,0,1,2,3]
    }
}

额外提示

  • 如果用的是Python、C#等其他语言,核心逻辑完全一致:先统计0的数量,判断是否超过阈值,再筛选非0元素完成收缩。
  • 对性能要求高的场景,优先用原地修改的双指针法,避免生成新数组带来的内存开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:03:01