class Solution {
public int singleNumber(int[] nums) {
int[] count = new int[32];
for (int n : nums) {
int i = 0;
while (n > 0) {
if (n % 2 == 1) {
count[i] ++;
}
i ++;
n >>= 1;
}
}
//也可以解决一个数字出现一次,其它出现m次
//有限状态机的化,其实就是三个1会转换到原来的状态,0不会转变状态,并且m次的化,就需要有m个状态
//也可以直接使用哈希,时间复杂度应该差不多,空间复杂度哈希表是O(N),N为不重复元素的个数,位统计的空间复杂度为O(32)
int res = 0, m = 3;
for (int i = 0; i < count.length; i ++) {
if (count[i] % m == 1) {
res += Math.pow(2, i);
}
}
return res;
}
}
class Solution {
public int singleNumber(int[] nums) {
int[] res = new int[32];
int m = 1;
int sum = 0;
for (int i = 0; i < 32; i++) {
for (int num : nums) {
if ((num & m) != 0) {
res[i]++;// 当前位为1,计数加1
}
}
res[i] = res[i] % 3;// 过滤出现3次的
sum += res[i] * m;
m <<= 1;
}
return sum;
}
}
class Solution {
public int singleNumber(int[] nums) {
int[] flag = new int[32];
int n = nums.length;
for(int i = 0;i<n;i++){
for(int j = 0;j<32;j++){
if((nums[i]&(1<<j))!=0){
flag[j]++;
flag[j]%=3;
}
}
}
int res = 0;
for(int i = 0;i<32;i++){
if(flag[i]==1){
res+=(1<<i);
}
}
return res;
}
}
class Solution {
public int singleNumber(int[] nums) {
int[] res = new int[32];
int m = 1;
int sum = 0;
for (int i = 0; i < 32; i++) {
for (int j = 0; j < nums.length; j++) {
if ((nums[j] & m) != 0) {
res[i]++;
}
}
res[i] = res[i] % 3;
sum = sum + res[i] * m;
m = m << 1;
}
return sum;
}
}
共以下 9 个回答
看的答案做的
统计1
笨方法,哈希表
地哥解法
不看题解不会做系列(非暴力法)
看到有个大神题解很好,有数电基础很容易理解,记录一下