缺失数字
给定一个包含 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;
}
}