现在有一个整数类型的数组,数组中只有一个元素只出现一次,其余元素都出现三次。你需要找出只出现一次的元素
数据范围: 数组长度满足 ,数组中每个元素的值满足
进阶:空间复杂度 , 时间复杂度
进阶:空间复杂度 , 时间复杂度
public class Solution { public int singleNumber (int[] A) { int i,j,k,l,count,flag=0; int []B=new int[10000]; for(i=0,k=0,count=1;i<A.length;i++){ count=1; for(j=i+1;j<A.length;j++){ if(A[j]==A[i]) count++; } //遍历辅助数组看A[i]是否在B[l]中 for(l=0;l<B.length;l++){ if(B[l]==A[i]){ flag=1; break; } } if(count>1&&flag==0) B[k++]=A[i]; else flag=0; } for(i=0,flag=0;i<A.length;i++){ for(j=0;j<B.length;j++){ if(A[i]==B[j]){ flag=1; break; } } if(flag==0) break; else flag=0; } return A[i]; } }
a | b | c | 结果a | 结果b |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 0 | 0 |
public class Solution { public int singleNumber(int[] A) { int a = 0, b = 0; for(int c:A){ int resultA = (a&~b&~c)|(~a&b&c); int resultB = (~a&b&~c)|(~a&~b&c); a = resultA; b = resultB; } return b; } }
import java.util.HashMap; public class Solution { public int singleNumber(int[] A) { HashMap<Integer,Integer> map=new HashMap<Integer,Integer>(); for(int i=0;i<A.length;i++){ if(map.containsKey(A[i])){ map.put(A[i],map.get(A[i])+1); }else{ map.put(A[i],1); } } for(int key:map.keySet()){ if(map.get(key)!=3){ return key; } } return 0; } }
public class Solution { public int singleNumber(int[] A) { int high = 0; int low = 0; for (int i = 0; i < A.length; i++) { high = high ^ (low & A[i]); low = low ^ A[i]; int cohigh = high; high = high & (~low); low = low & (~cohigh); } return (high << 1) + low; } }用两个数的同一位分别来表示该位的高位和低位,以实现模3加法。
//由于只有一个出现一次的数字,其余都是出现三次,那么有如下思路 // 针对于序列中出现三次的所有数字的每一位来说,相加的结果只有两种 //1+1+1==3 或者0+0+0=0 //那么再加上只出现一次的数字的对应位数字的话,也有两种0或者4 //所以我们可以对上述的每一位求和之后对3取余,结果将会是1或者0 //也就是代表了出现一次的的这个数字对应位置上是1或者0 public class Solution { public int singleNumber(int[] A) { if(A == null||A.length == 0){ return -1; } //得到出现一次的数字的值】 int result = 0; //int为4个字节,那么一共有4*8=32位 for(int i = 0;i < 32;i++){ //保存每一位求和值 int sum = 0; for(int j = 0;j < A.length;j++){ //累加所有数字上第i位上的数字 sum+=(A[j]>>i)&1; } //取余得到第i位上的数字,之后更新result result |= (sum % 3) << i; } return result; } }