1. 程式人生 > 實用技巧 >LeetCode283. 移動零

LeetCode283. 移動零

雙指標,用兩個指標zero和nonZero分別找到一個為0和一個不為0的數,且如果不為0的數在為0的數後面,則交換這兩個數。
如果在0的前面,則不用交換,zero指標不動,nonZero從zero指標的下一個位置開始尋找一個不為0的數,與zero指標交換。

重複這個過程,直到兩個指標其中之一越界。

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int zero = 0, nonZero = 0, size = nums.size();
        while(zero < size && nonZero < size) {
            while(zero < size && nums[zero] != 0) {
                ++zero;
            }
            if(zero == size) {
                return ;
            }
            while(nonZero < size && nums[nonZero] == 0) {
                ++nonZero;
            }
            if(nonZero == size) {
                return ;
            }
            if(zero < nonZero) {
                swap(nums[zero], nums[nonZero]);
            } else {
                nonZero = zero + 1;
            }
        }
    }
};