move zeros

QUESTION:

给一个数字[2,1,0,4,5,0,3], 把0移动到最后,其他元素顺序保持不变。要求时间复杂度O(n) 空间复杂度O(1)

EXPLANATION:

其实难点就是在于时间复杂度是O(n),怎么样才能是on呢,那么只能是进行一次循环。 那么你就需要两个指针,一个用来指0位置,一个用来指非0位置,遇到的话就将两者进行交换。 这样的话就可以确定只使用了一次循环。

SOLUTION:

    public static int[] moveZero(int[] nums){
        int zeroPoint = 0;
        int nonZeroPoint = 0;
        while(true){
            while(zeroPoint<nums.length && nums[zeroPoint]!=0) zeroPoint++;
            if(zeroPoint>=nums.length) break;

            if(zeroPoint>=nonZeroPoint) nonZeroPoint = zeroPoint+1;

            while (nonZeroPoint<nums.length&& nums[nonZeroPoint]==0) nonZeroPoint++;
            if(nonZeroPoint>=nums.length) break;

            swapArray(nums,zeroPoint,nonZeroPoint);
            nonZeroPoint++;
        }
        return nums;
    }