目录
- 1. 思路
- 2. 代码
题目链接:leetcode 17.04.消失的数字
题目描述:
1. 思路
要求算法复杂度为O(n),有两种方式:
(1)利用异或交换律
- 与nums所有元素异或一遍;
- 与0-n的值异或,nums中没出现的值就是消失的数。
(2)求和依次减去nums中的值
- 对nums元素求和;
- 依次减去nums中的元素,得到消失的数。
2. 代码
int missingNumber1(int* nums, int numsSize) {
int missingNumber = 0;
// 1.与nums中元素依次异或
for (int i = 0; i < numsSize; ++i) {
missingNumber ^= nums[i];
}
// 2.与0-n的值异或,nums中没出现的值就是消失的数
for (int num = 0; num <= numsSize; ++num) {
missingNumber ^= num;
}
return missingNumber;
}
int missingNumber2(int* nums, int numsSize){
int n = numsSize;
int missingNumber = 0;
// 1.等差数列公式求和(((首项 + 尾项) * 项数) / 2)
int sum = ((0 + n) * (n + 1)) / 2;
// 2.依次减去nums中的值,得到消失的数
for (int i = 0; i < numsSize; ++i) {
sum -= nums[i];
}
return missingNumber = sum;
}
注意项数的值,为啥是n + 1? 因为消失了一个数字,所以要加上。