LeetCode - 268. Missing Number
题目
解析
题目要求在 O(n)
时间和 O(1)
空间内完成。
也是一个很有意思的题目,简单的想法:
- 用一个变量
sumAll
记录包含没有丢失的那个数的所有的和(也可以用等差数列求和公式求出); - 然后求出数组的和
sum
,结果就是sumAll - sum
;
更好的解法,利用亦或的性质:
利用第四条性质,循环亦或 xor = xor ^ (i+1) ^ nums[i]
其中没有出现的数就会剩下来。
class Solution {
public int missingNumber(int[] nums) {
int sumAll = 0, sum = 0;
for(int i = 0; i < nums.length; i++){
sumAll += (i+1);
sum += nums[i];
}
return sumAll-sum;
}
}
用等差数列求和公式求出 sumAll
:
class Solution {
public int missingNumber(int[] nums) {
int sumAll = (0+nums.length)*(nums.length+1)/2; //等差数列
int sum = 0;
for(int i = 0; i < nums.length; i++)
sum += nums[i];
return sumAll-sum;
}
}
更加巧妙的方式,利用异或运算:
class Solution {
public int missingNumber(int[] nums) {
int xor = 0;
for(int i = 0; i < nums.length; i++)
xor = xor ^ (i+1) ^ nums[i];
return xor;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论