1,缺失的数字
[0, n]共n+1个数字,其中n个数字组成一个数组,求数组中缺失的数字。
来源:268. 丢失的数字
思路:等差数列和减数组的所有数。若考虑数字溢出,可在循环中同时+(i+1)-sum[i]。
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size();
int sum = (1+n)*n/2;
for (int i = 0; i < n; i++) {
sum -= nums[i];
}
return sum;
}
};
2,出现一次的数字(其余出现两次)
数组中只有一个数字出现一次,其余数字出现两次。
思路:利用 异或(相同为0,不同为1) 运算符,一个数字异或自己后为0。
int singleNumber(int* nums, int numsSize) {
int sum = 0;
for (int i = 0; i < numsSize; i++) {
sum = sum ^ nums[i];
}
return sum;
}
3,出现一次的数字(其余出现三次)
数组中只有一个数字出现一次,其余数字出现三次。
来源:137. 只出现一次的数字 II && 剑指 Offer 56 - II. 数组中数字出现的次数 II
思路:按位累加,结果对3求余。时间复杂度O(32N)。此思路同样可用于题2。
class Solution {
public:
int singleNumber(vector<int>&am