给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。
示例 1:
输入: [3,0,1]
输出: 2
示例 2:
输入: [9,6,4,2,3,5,7,0,1]
输出: 8
说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?
class Solution {
public:
// 利用高斯求和公式求总和然后减去实际的总和得到确实的值
/*
int missingNumber(vector<int>& nums)
{
int total_sum = nums.size() * (nums.size() + 1) / 2; // 总和
int actual_sum = 0;
for(int num : nums)
actual_sum += num; // 实际和
return total_sum - actual_sum; // 差为缺失的值
}
*/
// 异或运算, 原理: x ^ x ^ y = y
int missingNumber(vector<int> & nums)
{
// 注意初始化missing的值为nums.size(), 因为i没法为nums.size()
int n = nums.size();
int missing = n;
for(int i=0; i<n; ++i)
missing ^= i ^ nums[i];
return missing;
}
};
欢迎交流,批评指正!