领扣(LeetCode)移动零 个人题解

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

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

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

比较暴力的做法,就是依次判断是否为0,如果是0,用后面的数循环盖掉前面的数,然后在最末尾补0。就这样直到循环结束。不过这里要注意到循环结束的条件,未处理的数组内容是在缩短的,处理过的内容(也就是放在末尾的0)不需要重新处理。

代码如下:

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

同时网友题解也给出了比较聪明的做法。就是快慢指针。快针遍历,遇到非0,就让慢针指向的位置置为那个值,如果是0,则跳过。最后把缺的地方补全0。这样减少了数组本身的移动次数,有效提高了代码执行效率

代码如下:

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

 

posted @ 2018-12-04 22:47  AXiangCoding  阅读(188)  评论(0编辑  收藏  举报