reoger的记录

--以后的你会感激现在那么努力的自己

0%

移动零

283. 移动零(Move Zeroes)

题目难度: 简单

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

1
2
**输入:** `[0,1,0,3,12]`
**输出:** `[1,3,12,0,0]`

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

Solution

解题思路:

暴力解法。

从后往前遍历,当发现有0时,就其移动到最后,这个移动最后并不是仅仅将这个0和最后一个数字对调,而是将这个0之后所有的数字都往前挪一位。此法简单,暴力,时间复杂度较高,但是容易想到。代码如下:
Language: Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
   public void moveZeroes(int[] nums) {
       for(int i=nums.length-1;i>=0;i--){
      if(nums[i] == 0){
      move(nums,i);
      }
      }
  }
    private void move(int[] nums,int target){
  for(int i=target;i<nums.length-1;i++){
  nums[i] = nums[i+1];
  }
  nums[nums.length-1] = 0;
  }
}

将0过滤掉

从0开始遍历数组,维护一个指针pos用于表示当前非零数组的位置,维护一个指针i用于表示当前数组遍历的位置。
[0,1,0,3,12]为例,进行说明。
从0开始遍历数组,发现第一个数字为0,此时pos不做任何改变,仍然为0。
第二个数字为1,此时有nums[pos] = nums[i]nums[0] = nums[1],且pos++,即此时pos=1;
到第三个数字又为0,此时又不做任何改变。
到第四个数字的时候,我们即又num[1] = num[3],且pos++ ,即此时pos = 2.
如此我们就通过pos指针将数组中的0过滤掉了,最后我们添加相应的0到数组后面即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public void moveZeroes(int[] nums) {
int pos = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] != 0){
nums[pos]= nums[i];
pos++;
}
}
for(;pos<nums.length; pos++){
nums[pos] = 0;
}
}
}