题目详情请查看:https://leetcode-cn.com/leetbook/read/top-interview-questions/xmy9jh/ (opens new window)
这道题直接想怎么来就怎么来的解法:
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let zeroNum = 0;
for(let i=nums.length-1;i>=0;i--){
let num = nums[i];
if(num === 0){
zeroNum++;
nums.splice(i,1);
}
}
while(zeroNum--){
nums.push(0);
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
然而,这里又可以扯上双指针的解法,比上面的解法优化,快了一些,其中减少了大量不必要的数组元素移动。双指针不是数据结构,也不是什么算法思路,只是一种编程的技巧(但更能体现一种极客精神、数学的思想)。对比只有一个指针,双指针的引入可以轻易地达到优化的效果。
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function (nums) {
let l, r;
l = r = 0;
while (r < nums.length) {
if (nums[r] !== 0) {
while (l < r && nums[l] !== 0) {
l++;
}
if (l < r) {
let tmp = nums[l];
nums[l] = nums[r];
nums[r] = tmp;
}
}
r++;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21