雙指針法
c 語言實現?
void moveZeroes(int* nums, int numsSize) {int dest,cur; //創建臨時指針和目標指針dest=cur=0;//出初始化while(cur<numsSize)//遍歷{if(nums[cur]!=0){swap(&nums[cur],&nums[dest]);cur++;dest++;}else{cur++;}}}
思路是建立兩個指針,開始遍歷,cur指針指向數據不為0就交換并且讓cur++,dest++,為0就讓cur++
0? ? ? ? 1? ? ? ? 0? ? ? ? 3? ? ? ? 12? ? ? ? 為0只讓cur++
dest
cur
1? ? ? ? 0? ? ? ? 0? ? ? ? 3? ? ? ? 12? ? ? ? ? ? ? ? ? ? ? ? 不為0交換二者,讓cur++,dest++
? ? ? ? dest
? ? ? ? ? ? ? ? ? cur
1? ? ? ? 0? ? ? ? 0? ? ? ? 3? ? ? ? 12? ? ? ? ? ? ? ? ? ? ? 為0讓cur++
? ? ? ? dest
? ? ? ? ? ? ? ? ? ?cur? ? ? ? ?
1? ? ? ? 3? ? ? ? 0? ? ? ? 0? ? ? ? 12? ? ? ? ? ? ? ? 不為0就交換再讓cur++,dest++
? ? ? ? ? ? ? ? ? dest
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cur?
?1? ? ? ? 3? ? ? ? 0? ? ? ? 0? ? ? ? 12? ? ? ? ? ? ? ? 為0讓cur++
? ? ? ? ? ? ? ? ? ?dest
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur
1? ? ? ? 3? ? ? ? 12?? ? ? ?0? ? ? ? 0? ? ? ? ? ? ? ? ?不為0就交換再讓二者++
? ? ? ? ? ? ? ? ? ? ? ?? ? dest
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?????????????????????????????????cur=numsSize跳出循環
c++實現
思路相同初始值略有不同,更加簡潔
class Solution {
public:void moveZeroes(vector<int>& nums) {for(int dest=-1,cur=0;cur<nums.size();cur++)if(nums[cur])swap(nums[++dest],nums[cur]);}
};
其實這里還可以用快排來實現