// 获得整个数组异或后的值 for(int i : nums){ sum ^= i; } intn=1;
// 结果跟1进行与运算,等于0说明结果的倒数第一位是0,n左移一位让1从最低位移到倒数第二位,重复至找到第一个和结果进行与运算的值为1的n,此时n就是结果里最低位为1,其他位为0的值。 while((sum & n) == 0){ n <<= 1; } intx=0; inty=0; // 根据n来对数组里每个数进行与运算,数的二进制在该位为0和在该位为1的值分成两组,对这两组分别进行异或运算 for(int i : nums){ if((i & n) != 0){ x ^= i; } else{ y ^= i; } } int[] res = {x,y}; return res; } }
数组中数字出现的次数Ⅱ
这道题目的最优解引入了一个算法,叫有限状态转换机,但是我看不懂这个算法,只能作罢,直接背代码算了。
1 2 3 4 5 6 7 8 9 10 11 12
// 看不懂 classSolution { publicintsingleNumber(int[] nums) { intone=0; inttwo=0; for(int i : nums){ one = one ^ i & ~two; two = two ^ i & ~one; } return one; } }