268. Missing Number

原题链接:https://leetcode.com/problems/missing-number/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();
        System.out.println(s.missingNumber(new int[]{3, 0, 1}));
        System.out.println(s.missingNumber(new int[]{9, 6, 4, 2, 3, 5, 7, 0, 1}));
    }

    /**
     * 方法一:先排序,再查找缺失的数字。提交结果:17.21 %
     *
     * 时间复杂度:O(nlogn)
     * 空间复杂度:O(1)
     *
     * @param nums
     * @return
     */
    public int missingNumber1(int[] nums) {
        if (nums == null || nums.length == 0) {
            return -1;
        }

        Arrays.sort(nums);
        int i;
        for (i = 0; i < nums.length; i++) {
            if (nums[i] != i) {
                return i;
            }
        }

        return i;
    }

    /**
     * 方法二:这个方法是看了 Related Topics 中提到了 Bit Manipulation 才想起来的,😆哈哈异或操作真是神操作啊。提交结果:100 %
     *
     * 时间复杂度:O(n)
     * 空间复杂度:O(1)
     *
     * @param nums
     * @return
     */
    public int missingNumber(int[] nums) {
        if (nums == null) {
            return -1;
        }

        int res = 0, i = 0;
        for (; i < nums.length; i++) {
            res ^= nums[i];
            res ^= i;
        }

        res ^= i;
        if (res == 0) { // res == 0 即可能是因为数组 nums 中缺了一个 i,也可能是数组 nums 中缺了一个 0
            for (int j = 0; j < nums.length; j++) {
                if (nums[j] == 0) {
                    return i;
                }
            }
            return 0;
        } else {
            return res;
        }
    }

    // 官方答案一:就是我的方法一
    // 官方答案二:使用哈希表来解决,我也想到了这个方法,懒得写的
    // 官方答案三:就是我的方法二了,不过代码简洁方便确实比我的高出好多倍呢
    // 官方答案四:我曹,这方法老牛逼了,竟然能用上高斯求和的故事来解决,我服👍

}
posted @ 2018-03-24 10:23  optor  阅读(86)  评论(0编辑  收藏  举报