283. Move Zeroes

原题链接:https://leetcode.com/problems/move-zeroes/description/
代码如下:

import java.util.Arrays;

/**
 * Created by clearbug on 2018/2/26.
 */
public class Solution {

    public static void main(String[] args) {
        Solution s = new Solution();
        int[] nums = new int[]{1, 0};
        s.moveZeroes3(nums);
        System.out.println(Arrays.toString(nums));
    }

    /**
     * 方法一:这是我根据题目要求想出来的双指针方法,而且 Related Topics 里面也提到了 Two Pointers。然后提交结果是:10.10%,这结果
     * 让我很尴尬😓啊。好吧,我分析了一下,我这方法确实有点蠢,下面👇我就想到了方法二
     *
     * @param nums
     */
    public void moveZeroes1(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            int j = i + 1;
            if (nums[i] == 0) {
                while (j < nums.length && nums[j] == 0) {
                    j++;
                }
                if (j == nums.length) {
                    break;
                }
                nums[i] = nums[j];
                nums[j] = 0;
            }
        }
    }

    /**
     * 方法二:好吧,这个方法也并不是我想出来的,只是我脑子中闪现过这种思路罢了,但终究是没能写出实现来。这个实现还是抄袭提交区别人的答案。
     * 拿这个方法和方法一对比,可以看出方法一效率低的原因就是因为它的 j 指针进行了很多无谓的回溯,下面方法三就是对方法一所做的改进,效率大大
     * 提升了,但是代码确实丑了。。。
     * @param nums
     */
    public void moveZeroes(int[] nums) {
        if (nums == null || nums.length < 2) {
            return;
        }
        int k = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                int temp = nums[k];
                nums[k] = nums[i];
                nums[i] = temp;
                k++;
            }
        }
    }

    // 对方法一所做改进。提交结果:beats 79.70%
    public void moveZeroes3(int[] nums) {
        int j = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0) {
                if (j < i) {
                    j = i + 1;
                }
                while (j < nums.length && nums[j] == 0) {
                    j++;
                }
                if (j == nums.length) {
                    break;
                }
                nums[i] = nums[j];
                nums[j] = 0;
            }
        }
    }

    // 官方方法一:都不符合题目要求的解答就不说了,思路就是借助额外的空间来实现啦
    // 官方方法二:就是上面👆说的方法二的思路,只是不够最优罢了
    // 官方方法三:就是上面👆说的方法二了
}
posted @ 2018-03-24 11:24  optor  阅读(111)  评论(0)    收藏  举报