剑指 Offer-0~n-1中缺失的数字
Posted 数据结构和算法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer-0~n-1中缺失的数字相关的知识,希望对你有一定的参考价值。
截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666
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;
}
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;
}
public int missingNumber(int[] nums) {
int length = nums.length;
for (int i = 0; i < length; i++) {
if (nums[i] != i)
return i;
}
return length;
}
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;
}
以上是关于剑指 Offer-0~n-1中缺失的数字的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段
剑指Offer面试题53 - II. 0~n-1中缺失的数字