1. 程式人生 > >LeetCode 283 Move Zeroes

LeetCode 283 Move Zeroes

blog style left 移動 交換 size 容易 lee 也不會

是道容易題,可以想到很多解法,但有些解法容易出小錯誤:

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 }

LeetCode 283 Move Zeroes