目录
后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!
1.题目: 面试题 17.04. 消失的数字
力扣https://leetcode-cn.com/problems/missing-number-lcci/
数组
nums
包含从0
到n
的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
扫描二维码关注公众号,回复: 14356944 查看本文章![]()
2.思路:
1.排序
冒泡:O(N*N) 快排:O(N*logN)
2.映射(哈希法)
开辟一个数组(0-N)并初始化为某个值(这里使用-1不会与题目中的数冲突),每个值是多少就作为下标对应的位置写成多少,然后进行遍历,输出是-1的位置的下标即可。
遍历了2遍(2N),时间复杂度:O(N) 空间复杂度:O(N)
3.异或(相同为0,相异为1)
用一个value跟0-N的数字异或,再跟数据中的值异或,最后value就是缺失的数字,O(N)
4.等差数列公式 O(N)
将0-N的数全部相加,再减去数组nums,剩余的数就是消失的数。
3.解析:
解法1:
异或: int missingNumber(int* nums, int numsSize) { int x = 0; //x先与数组nums异或 for (int i = 0; i < numsSize; ++i) { x ^= nums[i]; } //x再与o-N异或 for (int i = 0; i <= numsSize; ++i) //for (int i = 0; i < numsSize+1; ++i)语句等价 { x ^= i; } return x; }
解法2:
求和相减: int missingNumber(int* nums, int numsSize) { int sum = 0; for(int i = 0; i< numsSize+1;i++) { sum+=i; } for(int i = 0;i <numsSize;i++) { sum-=nums[i]; } return sum; }