携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
一、题目描述:
283. 移动零 - 力扣(LeetCode) (leetcode-cn.com)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
- 1 <= nums.length <= 10^4
- -2^31 <= nums[i] <= 2^31 - 1
进阶:你能尽量减少完成的操作次数吗?
二、思路分析:
分析题目,可以发现 0 的作用只是作为一个符号标记, 因此没必要特别的保存0数据的信息。 首先设置俩个指针,分别指向数组首尾,(注:尾为数组长度,而不是数组最后一个数字的位置),遍历数组,移动首指针,当发现数组中
存在 0 元素时,将 0 后边的数据都向前位移一位,然后将尾指针向左移动一位,继续执行,直到完成对整个数组的遍历,而此时的尾指针所指
向的位置正是题目要求末尾0序列的开始, 此时从尾指针开始将剩余数组赋值为0,。(这也是尾指针= 数组长度的原因,如果不存在0的话, 没必要进行赋值处理)
三、AC 代码:
var moveZeroes = function(nums) {
let right = nums.length;
if(right <= 1) // 如果数组长度为0和1 直接结束循环;
return;
let left = 0, len = right;
for(let i = 0;i < right;i++) {
if(nums[i] == 0) {
for(let j = i + 1;j < right;j++) {
nums[j - 1] = nums[j];
}
right--;
i--;// 避免存在连续0时,部分0会被忽略掉的情况
}
}
for(let i = right;i < len;i++)
nums[i] = 0;
};
范文参考:
283. 移动零 - Python 统计左侧0的前缀和 然后一次位移到位 最后补零 - 移动零 - 力扣(LeetCode)