给定一个数组 A,除了一个数出现一次之外,其余数都出现三次。找出出现一次的数。
如:{1,2,1,2,1,2,7},找出7。
你的算法只能是线性时间的复杂度,并且不能使用额外的空间哦~
输入格式
第一行输入一个数 n(1≤n≤500),代表数组的长度。
接下来一行输入 n 个 int 范围内的整数,表示数组 A。保证输入的数组合法。
输出格式
输出一个整数,表示数组中只出现一次的数。
样例输入
4
0 0 0 5
样例输出
5
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int sum[]=new int[32]; //存放32位二进制数
int num,a; //num数组中元素个数,a输入的数组元素
for(int i=0;i<32;i++) //32位二进制数各位置0
sum[i]=0;
num=sc.nextInt();
String str; //临时存放元素的二进制字符串
int key; //控制二进制位
int temp=0; //判断各二进制位上是0或是1
for(int i=0;i<num;i++)
{
a=sc.nextInt(); //输入元素
str=Integer.toBinaryString(a); //转换为二进制字符串
key=31; //从最末位开始
for(int j=str.length()-1;j>=0;j--,key--) //二进制字符串转换为整形数组存放
{
if(str.charAt(j)=="1".charAt(0))
temp=1;
sum[key]+=temp; //各二进制位累加
sum[key]%=3; //各位累加结果对3求余,得出所求数字各二进制位上结果
temp=0; //temp重置为0参与下次循环
}
}
//for(int i=0;i<32;i++) 测试存放32位二进制数的数组结果
// System.out.print(sum[i]);
//System.out.println();
int result=0; //结果统计
for(int i=31;i>=0;i--) //按权累加
{
for(int j=31-i-1;j>=0;j--)
{
if(i==31) //如果是最后一位
{
sum[i]=1; //1的0次方为1
continue;
}
else
sum[i]*=2;
}
result+=sum[i];
}
System.out.println(result);
}
}