代码改变世界

LeetCode 283 Move Zeroes

2017-11-11 01:55  naturesound  阅读(148)  评论(0编辑  收藏  举报

是道容易题,可以想到很多解法,但有些解法容易出小错误:

1)交换法:

用一个指针p保存零元素起始位置。遍历数组,当发现是非零元素,则和前面的零元素交换,同时p自增一。

这个方法有几个地方容易想错,首先p的初始值怎么定义,如果你把p定义为第一个零元素的下标,则刚开始p你可能会定义为-1,因为你不知道第一个元素是否为零。

但其实p的初值可以为0,当第一个元素为0时自然没错,当第一个元素为非零时,相当于自己和自己交换,也不会错。但这样处理,程序会显得很简洁。

2)整体移动法:

这个方法思路更简单,更不易出错。遍历数组,将所有非零的数依次往前移动,直到移到最后一个数为止。最后将末尾的部分全部赋值0。

 1 //交换法    
 2 void moveZeroes(vector<int>& nums) {
 3        int j = 0;
 4        for(int i=0; i<nums.size(); i++){
 5            if(nums[i] != 0){
 6                swap(nums[i], nums[j++]);
 7            }
 8        }
 9     }
10 
11 //整体移动法
12 void moveZeroes(vector<int>& nums) {
13         int left = 0, right = 0, sz = nums.size();
14         for(right = 0; right < sz; right++){
15             if(nums[right] != 0){
16                 nums[left++] = nums[right];
17             }
18         }
19         while(left < sz)
20             nums[left++] = 0;
21     }