/** 方法一:哈希表 * @param {number[]} nums * @return {number} */ var singleNumber = function(nums) { let map = new Map(); let res; for(let num of nums){ freq.set(num, (freq.get(num)||0) +1 ) } for(let [m,c] of map){ if(c==1){ res = m; break; } } return res; }; /** 方法二:依次确定每一个二进制位 * @param {number[]} nums * @return {number} */ var singleNumber = function(nums) { let res = 0; for(let i = 0;i<32;i++){ let total = 0; for(let num of nums){ total += (num>>i)&1; } if(total%3 != 0){ res |= 1<<i; } } return res; }; let nums = [2,2,3,2] console.log(nums, singleNumber(nums)) nums =[0,1,0,1,0,1,99] console.log(nums, singleNumber(nums)) /** 状态机2 * @param {number[]} nums * @return {number} */ var singleNumber = function(nums) { let a = 0,b=0; for(let num of nums){ let aNext = ~a&b&num|a&~b&~num; let bNext = ~a&~b&num|~a&b&~num; a = aNext; b = bNext; } return b; };
状态机2来推导公式:
原文:https://www.cnblogs.com/yanjianjiang/p/14805674.html