白菜刷LeetCode记-136. Single Number

吼吼吼,今天进行第三条的程序练习,题目如下:

数组中除了一个数字,其他数字都是成双的,现在要找出这个单个的数字是什么。啥?人群中成双的一大把,就剩一个单身狗?还要告诉世人哪个才是?这题目有毒。

继续往下看,要求时间复杂度是线性,而且还建议不用额外的存储量。

首选的最简单的方法可能就是先将数组排序,然后遍历数组,然后识别出那个旁边没有跟自己一样的数,那个数就是结果了。

 1 /**
 2  * @param {number[]} nums
 3  * @return {number}
 4  */
 5 var singleNumber = function(nums) {
 6     nums.sort();
 7     let res = nums[0];
 8     
 9     for(let i = 1; i < nums.length ; i++){
10         if(nums[i-1] == nums[i] ){
11             res -= nums[i];
12         }else{
13             res += nums[i];
14         }
15     }
16     
17     return res;
18 };

还有没有更加便利的方法呢?考虑到如果全部数字都是成双的话,那么这个和减去输入数组的和不就是结果么?

那么重点就是如何算出如果全部数字都是成双后的那个和呢?在javascript标准库里头还是有set这个数据结构的。

 1 /**
 2  * @param {number[]} nums
 3  * @return {number}
 4  */
 5 var singleNumber = function(nums) {
 6     let tnums = new Set(nums);
 7     let sumset = 0, sumarr = 0;
 8     for(let item of tnums) sumset += item;
 9     for(let item of nums) sumarr += item;
10     
11     return 2*sumset - sumarr;
12 };

还有没有其他的方法呢?看了一下LeetCode里头的第四个用异或实现的答案,我跟小伙伴都惊呆了,以前没记住的关于异或的运算定律冲击着我脆弱的头脑。

代码如下:

 1 /**
 2  * @param {number[]} nums
 3  * @return {number}
 4  */
 5 var singleNumber = function(nums) {
 6     let res = 0;
 7     
 8     for(let item of nums){
 9         res ^= item;
10     }
11     
12     return res;
13 };

这种方法简单方便明了。附上讨论区小伙伴的惊叹作为结束。

原文地址:https://www.cnblogs.com/sssysukww/p/9524670.html