Алгоритм - цифровой массив появляется только

Предупреждение: Данная статья является блоггером оригинальной статьи, следовать CC 4.0 BY-SA авторского соглашения, воспроизведенный, пожалуйста , приложите ссылку первоисточника и это утверждение.
Эта ссылка: https://blog.csdn.net/weixin_45505313/article/details/102767316

1. Найдите массив чисел только один раз

На самом деле, эта тема в двух формах:

  1. В дополнении к массиву целых чиселОдин цифровой, И другие цифры появились в два раза, чтобы узнать, что появляется только один раз в цифровом
    如数组 [1,2,2,1,3], 则目标数字为 3

  2. В дополнении к массиву целых чиселА два номера, И другие цифры появились в два раза, чтобы найти два появился только один раз цифровой
    如数组 [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]);
	        
    }

рекомендация

отblog.csdn.net/weixin_45505313/article/details/102767316