题目描述
难度:Middle
相关话题:位运算
给定一个非空 整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2]
输出: 3
示例2:
输入: [0,1,0,1,0,1,99]
输出: 99
思路:
对于时间O(n)
,空间O(1)
的算法,需要编写一个状态机,当一个数出现3
次,会抵消。
如果单变量使用^
,只能抵消偶数次数,如果要3
次抵消,必须要有2个变量同时^
。
a=a^nums[i]
b=b^nums[i]
但仅仅这样两个变量完全一致,无法3
次抵消。
因此还需要使用~
,~
的作用是将0
变为1
,1
变为0
,同时也可以将当前状态逆转。
a=(a^nums[i]) ~ b
b=(b^nums[i]) ~ a
例如一个数组[2,2,2,2,2,2]
,它每次的a
和b
输出值为2,0
,0,2
,0,0
,2,0
,0,2
,0,0
,每3
次置零。
/**
* @ Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
let a=0,b=0
for(let n of nums){
a=(a^n) & ~b
b=(b^n) & ~a
}
return a
};
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com