283J. Move Zeroes

https://leetcode.com/problems/move-zeroes/

最优解

本题和 27 思路一致 https://leetcode.com/problems/remove-element/

这是愚蠢版本的代码,但是想法也没错。 用快慢指针,快指针永远指向下一个非0的数,然后慢指针就把这个数取得, 然后挪一次慢指针。 while 内的 while 是用来移动快指针到下一个非0的值。判断语句 是用来防止末尾是0从而令指针超出范围。 优化:可以用for来避免这个。 后面的temp来交换也没必要,第一遍可以不管是否有0,只需要while完之后 将slow 之后的都赋值为0即可,比较简便。

</pre>

class Solution {
    public void moveZeroes(int[] nums) {
        int slow = 0, fast = 0;
        int temp;
        while(fast < nums.length){
            while(nums[fast] == 0){
                if(fast < nums.length - 1){
                    fast++;
                }else{
                    break;
                }
            }
            temp = nums[fast];
            if(nums[slow] == 0){
                nums[fast] = 0;
            }
            nums[slow] = temp;
            slow++;
            fast++;
        }
    }
}

确实练习是有进步的

新方法,自动最优了。

class Solution {
    public void moveZeroes(int[] nums) {
        int left = 0;
        for(int i = 0; i < nums.length; i++){
            if( nums[i] != 0 ){
                swap(nums, i, left);
                left++;
            }
        }
    }
    public void swap(int[] nums, int i, int j ){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

Last updated

Was this helpful?