剑指 Offer-0~n-1中缺失的数字_leetcode
剑指 Offer-0~n-1中缺失的数字_剑指 Offer_02

public int missingNumber(int[] nums) {
int xor = 0;
for (int i = 0; i < nums.length; i++)
xor ^= nums[i] ^ (i + 1);
return xor;
}

或者还可以这样写,原理都是一样的

public int missingNumber(int[] nums) {
int xor = 0;
for (int i = 0; i < nums.length; i++)
xor ^= nums[i] ^ i;
return xor ^ nums.length;
}

剑指 Offer-0~n-1中缺失的数字_leetcode_03

public int missingNumber(int[] nums) {
int length = nums.length;
int sum = (0 + length) * (length + 1) / 2;
for (int i = 0; i < length; i++)
sum -= nums[i];
return sum;
}

剑指 Offer-0~n-1中缺失的数字_算法_04

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

剑指 Offer-0~n-1中缺失的数字_剑指 Offer_05

public int missingNumber(int[] nums) {
int start = 0;
int end = nums.length - 1;
while (start < end) {
int mid = start + (end - start) / 2;
if (nums[mid] == mid) {
//如果nums[mid] == mid也就是说当前元素的
//下标等于他自己,比如数组[0,1,2,3,4,5]每
//个元素的下标都等于他自己,说明[start,mid]
//没有缺少任何数字,那么缺少的肯定是在[mid+1,end]
start = mid + 1;
} else {
//如果当前元素的下标不等于他自己,比如[0,1,2,4]中
//nums[3]==4,说明说明缺少的数字就在这个区间内
end = mid;
}
}
//如果类似于[0,1,2,3]这种start指向了数组的最后一个,我们让他加1
return start == nums[start] ? start + 1 : start;
}

当然还可以换种写法

public int missingNumber(int[] nums) {
int start = 0;
int end = nums.length - 1;
while (start <= end) {
int mid = start + (end - start) / 2;
if (nums[mid] == mid) {
//如果nums[mid] == mid也就是说当前元素的
//下标等于他自己,比如数组[0,1,2,3,4,5]每
//个元素的下标都等于他自己,说明[start,mid]
//没有缺少任何数字,那么缺少的肯定是在[mid+1,end]
start = mid + 1;
} else {
//注意这里写法和上面代码不一样
end = mid - 1;
}
}
return start;
}