p48 向后移动零 (leetcode 283)

一:解题思路

方法一:使用快慢游标法,慢游标指向非零元素的插入位置,快游标指向非零元素。如果快游标指向零元素,则向后移动一位,否则将快游标所指向的元素赋值给慢游标所指向的元素。

方法二:同样使用快慢游标法,当快游标指向零元素的时候,向后移动一个位置,当遇到指向不为零的元素的时候,与慢游标指向的元素进行相互交换。

上述2种方法的Time:O(n),Space:O(1)

二:完整代码示例 (C++版和Java版)

方法一C++:

class Solution 
{
public:
    void moveZeroes(vector<int>& nums) 
    {
        if (nums.size() == 0) return;
        int slow = 0;

        for (int fast = slow; fast < nums.size(); fast++)
        {
            if (nums[fast] != 0)
            {
                nums[slow++] = nums[fast];
            }
        }

        while (slow < nums.size())
        {
            nums[slow++] = 0;
        }
    }
};

方法一Java:

class Solution 
{
    public void moveZeroes(int[] nums) 
    {
          if(nums==null||nums.length==0) return;
          int slow=0;
          
          for(int fast=slow;fast<nums.length;fast++)
          {
              if(nums[fast]!=0)
              {
                  nums[slow++]=nums[fast];
              }
          }
          
          while(slow<nums.length)
          {
              nums[slow++]=0;
          }
    }
}

方法二C++:

class Solution {
public:
    void swap(int& a, int& b) { int c = a; a = b; b = c; }

    void moveZeroes(vector<int>& nums) 
    {
        if (nums.size() == 0) return;
        int slow = 0;

        for (int fast = slow; fast < nums.size(); fast++)
        {
            if (nums[fast] != 0)
            {
                swap(nums[slow++],nums[fast]);
            }
        }
    }
};

方法二Java:

class Solution
{
    public void moveZeroes(int[] nums)
    {
          if(nums==null||nums.length==0) return;
          int slow=0;
          
          for(int fast=slow;fast<nums.length;fast++)
          {
              if(nums[fast]!=0)
              {
                  int temp=nums[fast];
                  nums[fast]=nums[slow];
                  nums[slow]=temp;
                  slow++;
              }
          }
    }
}

猜你喜欢

转载自www.cnblogs.com/repinkply/p/12511726.html