LeetCode 热题 100 之第4题 移动零(JavaScript篇)

58 阅读3分钟

传送门:283. 移动零 - 力扣(LeetCode)

题目:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

  提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

解题思路

  • moveZeroes函数采用双指针优化法实现数组零元素移动:首先初始化stacks指针记录非零元素位置,通过遍历数组将所有非零元素按原顺序依次填充到数组前端(stacks指针同步后移),待非零元素前置完成后,从stacks指针位置开始使用fill()方法将数组剩余部分填充为零。该算法通过一次遍历完成非零元素前置、一次操作完成尾部补零,实现了O(n)时间复杂度和O(1)空间复杂度,在原地修改数组的同时保持了非零元素的相对顺序。

代码

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let stacks = 0; // 用于记录非零元素应该放置的位置指针
    
    // 遍历数组,将非零元素按顺序移到数组前端
    for(const x of nums) {
        if(x !== 0) {
            nums[stacks++] = x; // 将非零元素放到当前指针位置,并移动指针
        }
    }
    
    // 从指针位置开始,将剩余元素填充为零
    nums.fill(0, stacks);
};

每天一学

在 JavaScript 中,fill() 是数组的一个非常实用的方法,用于将数组中的所有元素填充为一个固定值。它可以用来初始化数组、批量赋值等。


🧠 语法

arr.fill(value[, start = 0[, end = this.length]])

参数说明:

参数类型描述
valueany用来填充数组的值(可以是数字、字符串、对象等)
startnumber填充的起始索引(包含),默认是 0
endnumber填充的结束索引(不包含),默认是 this.length

⚠️ 注意:fill() 方法会修改原数组,不会返回新数组。


✅ 基本用法示例

示例 1:填充整个数组

let arr = [1, 2, 3, 4];
arr.fill(0);
console.log(arr); // 输出: [0, 0, 0, 0]

示例 2:从索引 1 开始填充

let arr = [1, 2, 3, 4];
arr.fill(5, 1);
console.log(arr); // 输出: [1, 5, 5, 5]

示例 3:指定范围填充

let arr = [1, 2, 3, 4, 5];
arr.fill('x', 1, 4);
console.log(arr); // 输出: [1, "x", "x", "x", 5]

📌 高级用法

✅ 用 fill() 初始化固定长度的数组

let arr = new Array(5).fill(0);
console.log(arr); // 输出: [0, 0, 0, 0, 0]

这个技巧常用于 LeetCode 等算法题中初始化数组。

✅ 填充引用类型(注意引用共享)

let arr = new Array(3).fill([]);
arr[0].push(1);
console.log(arr);
// 输出: [[1], [1], [1]]

⚠️ 注意: 因为 fill([]) 只创建了一个空数组,并将其引用复制到每个位置,所以三个位置都指向同一个数组!

如果你希望每个子数组独立,应该使用 .map() 来分别创建:

let arr = new Array(3).fill(null).map(() => []);
arr[0].push(1);
console.log(arr); // [[1], [], []] ✅ 正确

🛠 使用场景总结

场景说明
初始化数组new Array(n).fill(0) 创建 n 个 0 的数组
批量替换元素替换数组中一段连续的元素为某个值
构建模板数组如 [...new Array(7)].fill('default')
游戏开发初始化棋盘、地图等二维数组
算法题常用如动态规划中初始化 dp 数组

📝 总结一句话:

fill() 是一个非常方便的数组方法,用于将数组的某些或全部元素填充为指定值。它适用于初始化、替换、构建模板数组等场景,但要注意对引用类型的处理方式。