- 题目一: 数组中只出现一次的两个数字。
一个整型数组里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
-
方法: 异或法
-
代码:
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int temp = array[0];
for(int i = 1; i < array.length; i++){
temp = temp ^ array[i];
}
int index = 0;
while((temp & 1) != 1){
temp = temp >> 1;
index++;
}
int indexData = 1 << index;
for(int i = 0; i < array.length; i++){
if((array[i] & indexData) == indexData){
num1[0] = num1[0] ^ array[i];
}else{
num2[0] = num2[0] ^ array[i];
}
}
}
}
- 题目二: 数组中唯一只出现一次的数字。
在一个数组中,除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
-
方法: 位运算
-
代码:
public class Solution {
public int FindNumsAppearOnce(int [] array) {
int[] count = new int[32];
for(int i = 0; i < count.length; i++){
for(int j = 0; j < array.length; j++){
if((array[j] & 1) == 1){
count[i]++;
}
array[j] = array[j] >> 1;
}
}
int onceNum = 0;
for(int i = 0; i < count.length; i++){
onceNum += (count[i] % 3) << i;
}
return onceNum;
}
}