[LeetCode] 268. Missing Number
Posted aaronliu1991
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 268. Missing Number相关的知识,希望对你有一定的参考价值。
找到失踪的数字。题意是在一个长度为n的数组里面,存放着从0-n所有的数字,但是少一个。找出这个少了的数字。
两种思路
1. 数学方法
如果数组是完整的,整个数组的和应该是(首项+末项)x 项数 / 2 →设为A
事实情况的加和设为B,A - B即可得到失去的数字,代码如下
时间O(n)
空间O(1)
1 /** 2 * @param {number[]} nums 3 * @return {number} 4 */ 5 var missingNumber = function(nums) { 6 let res = 0; 7 let len = nums.length; 8 let expected = ((1 + len) * len) / 2; 9 let calculated = 0; 10 for (let i = 0; i < nums.length; i++) { 11 calculated += nums[i]; 12 } 13 res = expected - calculated; 14 return res; 15 };
2. 位运算方法
因为数组长度是n,数组里面的数字是0-n范围内的,也许我们可以将数组num[i]和他们的下标做一个关联,由此想到了位运算的做法。例子,如果数组是排序好的(没排序也行,因为位运算遵循交换律,此处为解释方便)
每个数字num[i]和下标i做异或运算XOR,若两者相同,结果为0。根据题意,应该最后就剩下某个数字M= num[i]。M和0再做异或运算,还是M。所以M就是那个失踪的数字。代码如下,
时间O(n)
空间O(1)
1 /** 2 * @param {number[]} nums 3 * @return {number} 4 */ 5 var missingNumber = function(nums) { 6 let res = nums.length; 7 for (let i = 0; i < nums.length; i++) { 8 res ^= i ^ nums[i]; 9 } 10 return res; 11 };
以上是关于[LeetCode] 268. Missing Number的主要内容,如果未能解决你的问题,请参考以下文章