缺失数字 【leetCode 使用异或求解找一个缺省值问题】

                                                       缺失数字

给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

示例 1:

输入: [3,0,1]
输出: 2

示例 2:

输入: [9,6,4,2,3,5,7,0,1]
输出: 8

说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?

求解:对于这类问题的变种也很多,比如有一个长度为10000的数列, 存放着1-10000的自然数, 连续, 不重复, 但数列并不是有序的现在随机选取1-10000之间的某个自然数, 加入到这个数列中, 要求用简便的算法找到这个后来加入的数。这个问题和本题的解法相同,就是使用异或。

    我们先来了解一下异或的特点:

         1.两个相同的数按位异或结果为0

         2.任何数和零按位异或结果为这个数本身

    所以有1^1=0, 1^1^2=2, 1^1^2^2^3=3,这样我们就可以从0开始遍历,我们异或0-n,然后再异或数组里面的值。

public class Test07 {
    public static void main(String[] args) {
        int[] a={9,6,4,2,3,5,7,0,1};
        System.out.println(missingNumber(a));
    }

    public static int missingNumber(int[] nums) {
        int n=0;
        for (int i = 0; i < nums.length ; i++) {
            n=n^i;
            n=n^nums[i];
        }
        n=n^nums.length;  //这一步不要忘记,数组是从0-n ,总共是n+1个数
        return n;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35634181/article/details/82153121