现在有一个整数类型的数组,数组中只有一个元素只出现一次,其余元素都出现三次。你需要找出只出现一次的元素
数据范围: 数组长度满足
,数组中每个元素的值满足 
进阶:空间复杂度
, 时间复杂度 )
进阶:空间复杂度
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;
}
}