传送门: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]])
参数说明:
参数 | 类型 | 描述 |
---|---|---|
value | any | 用来填充数组的值(可以是数字、字符串、对象等) |
start | number | 填充的起始索引(包含),默认是 0 |
end | number | 填充的结束索引(不包含),默认是 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()
是一个非常方便的数组方法,用于将数组的某些或全部元素填充为指定值。它适用于初始化、替换、构建模板数组等场景,但要注意对引用类型的处理方式。