用位运算查找一个出现奇数次的数和两个出现奇数次的不同数,代码实现
上代码:
package com.alg.exclusive; public class classify { public static void main(String[] args) { // 找出数组中其中只出现奇数次的数 int[] arr = {1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8}; System.out.println(classify(arr)); // 找出有两个只出现奇数次的不同数 int[] arr1 = {1, 1, 2, 2, 200, 300, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 8, 7, 8, 9, 9, 0, 0}; int[] arr2 = classifyNums(arr1); for (int cur : arr2) { System.out.println(cur); } } public static int classify(int[] arr) { int num = 0; for (int cur : arr) { num ^= cur; } return num; } public static int[] classifyNums(int[] arr) { int temp = 0; for (int cur : arr) { temp ^= cur; } // 得到右边的位为1的数,其他位均为0 ~temp+1此处为补码 int rightOne = temp & (~temp + 1); int[] num = new int[2]; for (int cur : arr) { if ((rightOne & cur) == 0) { num[0] ^= cur; } } num[1] = num[0] ^ temp; return num; } }