problems:
Given an array containing n distinct numbers taken from 0, 1, 2, …, n, find the one that is missing from the array.
Example 1:
Input: [3,0,1]
Output: 2
Example 2:
Input: [9,6,4,2,3,5,7,0,1]
Output: 8
tips:
看似很简单的题目,很有趣味性。
solutions:
1.下标判断法:
class Solution {
public:
int missingNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n = nums.size();
int k=n;
for(int i= 0;i<n;i++)
{
if(nums[i] != i)
{
k=i;
break;
}
}
return k;
}
};
2.异或法:
十进制的异或操作先转换为二进制,然后进行异或操作。相同为0,与0异或操作为自己,满足交换律
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size();
int k = n;
for(int i=0;i<n;i++)
{
k^=nums[i]^i;//可以理解为全部进行异或操作后先存储,然后再进行异或
}
return k;
}
};
理解:1^1^2^2^3^3^4^4...
3.等差数列求和法:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size();
int k = n*(n+1)/2;
for(int i=0;i<n;i++)
{
k=k-nums[i];
}
return k;
}
};
4.二分法
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(),nums.end());
int left = 0,right = nums.size();
while(left < right)
{
int mid = left + (right-left)/2;
if(nums[mid] > mid) right = mid;//这里注意
else
left = mid+1;
}
return right;
}
};