题目地址

解题思路

看完示例,第一反应是使用降序排序,但是排序不符合题意,要求不能改变非零的顺序。写了一般,但是感觉不是特别符合题意。因为题目要去不能复制元素。下面是第一版本的代码:

代码

  1. var moveZeroes = function(nums) {
  2. const len = nums.length;
  3. const res = Array(len).fill(0);
  4. let k = 0;
  5. for(let i = 0;i<len;i++){
  6. if(nums[i] != 0){
  7. res[k] = nums[i];
  8. k++;
  9. }
  10. }
  11. for(let i = 0;i<len;i++){
  12. nums[i] = res[i]
  13. }
  14. return nums;
  15. };

优化

根据题解,可以使用双指针的方式进行解题。定义两个指针,初始值都是从0开始。右侧的指针的值不为0的情况下,交互两个指针的值。然后左边的指针+1,右边的指针在判断结束后,进行+1操作

var moveZeroes1 = function(nums) {
    let l = 0,r = 0, n = nums.length;
    while(r<n){
        if (nums[r] != 0) {
            [nums[l],nums[r]] = [nums[r],nums[l]]
            l++;
        }
        r++;
    }
    return nums;
};
const nums = [0,1,0,3,12] 
console.log('--result--',moveZeroes1(nums));