LeetCode 137. Single Number II

Given a non-empty array of integers, every element appears three times except for one, which appears exactly once. Find that single one.面试

Note:数组

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?app

Example 1:spa

Input: [2,2,3,2]
Output: 3

Example 2:code

Input: [0,1,0,1,0,1,99]
Output: 99
 
题目很简单就是数组中全部的数字都出现三次,只有一个数字出现一次,在O(n)的时间复杂度和O(1)的空间复杂度找出这个惟一出现一次的数。
 
其实个人第一反应是用一个数组记录每个二进制位出现1的个数,若是不能被3整除,证实所求的数字在该二进制位为1。
 
思路没问题,可是…………
 & 

去!你!妹!哦!blog

 
相信你们都作过一道面试题,数组中全部的数字都出现两次,只有一个数字出现一次,在O(n)的时间复杂度和O(1)的空间复杂度找出这个惟一出现一次的数。
 
答案很简单,利用异或的性质,求全部的数字异或和,就是答案。
 
 
二进制有两个状态,0 和 1 ,恰好能够对应该二进制位 1 出现的次数 % 2 ,若是 %2 = 1 就是咱们要求的。
 
那若是是出现三次,咱们想知道的是一位出现 1 的次数 %3 = 1 的位置。而 %3 为出现 0 1 2 很明显一个二进制位是不够用的,只要用两个二进制位就行了。假设这两个数是 a 和 b
 
ab
00 -->  0
01  -->  1
10  -->  2
 
a 表示 第二位 b 表示第一位
 
可是,这样确定不能简单经过异或来计算了。咱们假设有一种运算为@
 

 

这样呢 咱们只须要
for x: nums
    ab = ab @ x

就能够啦~three

 

至于 @ 这个符号具体该怎么计算啊=。=要经过位运算实现啊(硬凑仍是能凑出来的。。。可意会不可言传。。。咳。。。element

[a, b] = [a ^ ((a | b) & x), (~a) & (b ^ x)]

 

完整代码:it

var singleNumber = function(nums) {
    let a = 0, b = 0;
    for (let x of nums) {
        [a, b] = [a ^ ((a | b) & x), (~a) & (b ^ x)];
    }
    return b;
};
相关文章
相关标签/搜索