目录
- 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? 因为消失了一个数字,所以要加上。