【前端100问】Q82:周一算法题之「移动零」
2021-02-16 本文已影响0人
alanwhy
写在前面
此系列来源于开源项目:前端 100 问:能搞懂 80%的请把简历给我
为了备战 2021 春招
每天一题,督促自己
从多方面多角度总结答案,丰富知识
周一算法题之「移动零」
简书整合地址:前端 100 问
正文回答
题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
代码
function zeroMove(array) {
let len = array.length;
let j = 0;
for (let i = 0; i < len - j; i++) {
if (array[i] === 0) {
array.push(0);
array.splice(i, 1);
i--;
j++;
}
}
return array;
}
function moveZeroToLast(arr) {
let index = 0;
for (let i = 0, length = arr.length; i < length; i++) {
if (arr[i] === 0) {
index++;
} else if (index !== 0) {
arr[i - index] = arr[i];
arr[i] = 0;
}
}
return arr;
}
// 双指针法
function moveZero(nums) {
let i = 0;
for (let j = 0; j < nums.length; j++) {
if (nums[j] !== 0) {
// * nums[j]不等于0,i必进一
if (nums[i] === 0) {
// * 如果nums[i]等于0了,则交换,否则只进一
let temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
i++;
}
}
return nums;
}
let nums = [0, 1, 0, 3, 12];
let nums1 = [1, 2, 0, 4, 3];
let nums2 = [1, 0, 0, 4, 3];
console.log(moveZero(nums));
console.log(moveZero(nums1));
console.log(moveZero(nums2));