1. Найдите массив чисел только один раз
На самом деле, эта тема в двух формах:
-
В дополнении к массиву целых чиселОдин цифровой, И другие цифры появились в два раза, чтобы узнать, что появляется только один раз в цифровом
如数组 [1,2,2,1,3], 则目标数字为 3
-
В дополнении к массиву целых чиселА два номера, И другие цифры появились в два раза, чтобы найти два появился только один раз цифровой
如数组 [1,2,2,1,3,5], 则目标数字为 3,5
2. Решение
2,1 не только дублирующие номера
Идеи:Использование оператора XOR ^, С другими числами 0 XOR результате этого числа, исключающее ИЛИ, чтобы получить равное число 0
- В дополнении к массиву одно числа появляется только один раз, остальные цифры появляются в два раза, так что переменное определенное начальное значение 0, а переменный массив, каждый рисунок представляет собой операцию исключающий ИЛИ, и эти переменную обновляет значение результата операции, пока обход массива не будет завершен, в результате чего значение переменного представляет собой массив только появился однажды, что число
public static int findOnceFrom2(int[] a) {
int len = a.length, res = 0;
for (int i = 0; i < len; i++) {
res = res ^ a[i];
}
return res;
}
2.2 Есть два неповторяющихся чисел
На самом деле, эта проблема основана на расширении вышеуказанных проблем,Во-первых, видно, что, когда есть только один номер один случай, массив всех чисел в последовательности исключающее или операции, то, что осталось, это единственное число, так как пары смещены.
- Согласно этой идее, в первую очередь я бы первый XOR
最后剩下的数字肯定是A、B异或的结果 C,以数组 [1,2,2,1,3,5]为例, 则 A=3(0011),B=5(0101),结果C=6(0110)
. С-битовое двоичное представление , где 1, на самом делеA 和 B 的二进制表示中数值不同的位
. Берем первый один , где位数 index
мы можем увидеть первые два, то естьindex=2
,Таким образом, исходный массив разделить на две группы, то группировка критерием является количество двух 1. Такая пара чисел в утвердительной группе, такое же количество, как значения всех битов являются одинаковыми, и, конечно, не то же самое число различных групп, После этих двух групп по линиям начала, а затем XOR, а остальные два результата является то, что эти две цифры появляются только один раз
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if(array == null || array.length <= 1){
num1[0] = num2[0] = 0; // 初始化为 0
return;
}
int len = array.length, index = 0, sum = 0;
for(int i = 0; i < len; i++){
sum ^= array[i];
}
for(index = 0; index < 32; index++){
if((sum & (1 << index)) != 0) break; // 获取第一个 1 所在位数 index
}
for(int i = 0; i < len; i++){
if((array[i] & (1 << index))!=0){ // 根据 index 将数组分为两部分
num2[0] ^= array[i];
}else{
num1[0] ^= array[i];
}
}
System.out.println(num1[0]+" "+num2[0]);
}