码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] 268. Missing Number

时间:2019-10-16 00:02:10      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:nbsp   code   关联   rar   param   etc   方法   相同   miss   

找到失踪的数字。题意是在一个长度为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

标签:nbsp   code   关联   rar   param   etc   方法   相同   miss   

原文地址:https://www.cnblogs.com/aaronliu1991/p/11681825.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!