白菜刷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 };
这种方法简单方便明了。附上讨论区小伙伴的惊叹作为结束。