找出单独出现的数字
给出N个数字。其中仅有一个数字出现过一次,其他数字均出现过两次,找出这个出现且只出现过一次的数字。要求时间和空间复杂度最小。
一开始是很普通的想法,从第一个数开始,从前往后遍历。但两个数相同时,将两数赋一个不可能出现的值。再重新遍历数组,找出没有被赋予不可能出现值的值。
private static String solution(String line) {
String[] array = line.split(" ");
String result="All are duplicate values.";
for (int i = 0; i < array.length-1; i++) {
for(int j=i+1;j<array.length;j++){
if(array[i].equals(array[j])){
//但两个String的数相同时 将其都赋值为不可能出现的值
array[i]="A";
array[j]="A";
break;
}
}
}
for(int i=0;i<array.length;i++){
if(!array[i].equals("A")){
result=array[i];
}
}
return result;
改进方法,用位运算,利用了(^)异或运算的特点(一个数据对另一个数据异或两次,该数据本身不发生改变。)。只需要一遍遍历,就可完成。
private static int solution(String line) {
String[] array = line.split(" ");
int result=0;
for (int i = 0; i < array.length; i++)
{
result ^= Integer.parseInt(array[i]);
}
return result;
}