[LeetCode]283. Move Zeroes

283. Move Zeroes
Easy

Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.

Example:

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

Note:

  1. You must do this in-place without making a copy of the array.
  2. Minimize the total number of operations.

题目大意:给定一个数组,在不改变数组中数字排序的情况下,将数组中所有的0都移动到数组的尾部

注意:1.不能使用新的数组  2.尽可能少的对数组进行修改

 

思路:

方法一:

遍历数组,记录数组中0的个数,并将数组中的0删除掉,最后在数组尾部插入相应数量的0.这么做的缺点是,对于有的语言,没有对数组操作的函数的话,很难实现,并且时间复杂度较高。

代码如下:

JavaScript:

/*JavaScript*/
var moveZeroes = function(nums) {
    let zero_num=0;
    for(let i=0;i<nums.length;++i){
        if(nums[i]===0){
            zero_num++;
            nums.splice(i,1);
            i--;
        }
    }
    while(zero_num--){
        nums.push(0);
    }
    return nums;
};

 

方法二:

维护一个游标zero_start,指示数组中0开始的地方,遍历数组,遇到非0数组就将那个数字放到zero_start指示的地方,然后将zero_start向前移动1.

增加边界判断,数组大小为小于等于1,就直接返回数组本身。

代码如下:

JavaScript:

/*JavaScript*/
var moveZeroes = function(nums) {
    if(nums.length<=1)return nums;
    
    let zero_start=-1;
    for(let i=0;i<nums.length;++i){
        if(nums[i]==0 && zero_start==-1){
            zero_start=i;
        }
        else if(nums[i]!=0 && zero_start!=-1){
            nums[zero_start]=nums[i];
            nums[i]=0;
            zero_start++;
        }
    }
    return nums;
};

 C++:

/*C++*/
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        if(nums.size()<=1)return;
        int zero_start=-1,
            len=nums.size();
        
        for(int i=0;i<len;++i){
            if(nums[i]==0 && zero_start==-1){
                zero_start=i;
            }
            if(nums[i]!=0 && zero_start!=-1){
                nums[zero_start]=nums[i];
                nums[i]=0;
                zero_start++;
            }
        }
    }
};

/**代码优化下*/
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        if(nums.size()<=1)return;
        for(int i=0,j=0;i<nums.size();++i){
            if(nums[i]){
                swap(nums[i],nums[j++]);
            }
        }
    }
};

 Python:

#Python3
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        j=0;
        for i in range(len(nums)):
            if(nums[i]):
                nums[i],nums[j]=nums[j],nums[i]
                j=j+1

 

 

posted @ 2020-11-19 13:26  程嘿嘿  阅读(71)  评论(0编辑  收藏  举报