两种方式实现:
1 package bitOperation; 2 3 import java.util.Arrays; 4 import java.util.Random; 5 6 /** 7 * @author zsh 8 * @company wlgzs 9 * @create 2019-02-14 10:12 10 * @Describe 题目· 11 * 找出唯一成对的数1-1000这1000个数放在含有1001个元素的数组中, 12 * 只有唯一的个元素值重复,其它均只出现一次。 13 * 每个数组元素只能访问一次,设计一个算法,将它找出来; 14 * 不用辅助存储空间,能否设计一个算法实现? 15 */ 16 public class Main1 { 17 public static void main(String[] args) { 18 //总数N 19 int N = 11; 20 int[] arr = new int[N]; 21 //生成1-1000的随机数,范围[0,N) 22 int index = new Random().nextInt(N-1)+1; 23 //给数组的元素赋值 24 for (int i = 0; i < arr.length-1; i++) { 25 arr[i]=i+1; 26 } 27 //最后一个数,是随机数 28 arr[arr.length-1] = index; 29 //打印数组 30 System.out.println(Arrays.toString(arr)); 31 int x1 = 0; 32 for (int i = 1; i < N; i++) { 33 x1 = x1 ^ i; 34 } 35 for (int i = 0; i < N; i++) { 36 x1 = x1 ^ arr[i]; 37 } 38 System.out.println(x1); 39 40 System.out.println("---------------使用辅助空间实现--------------------"); 41 int[] helper = new int[N]; 42 for (int i = 0; i < N; i++) { 43 //将每个数出现的数量放在0-1000个元素中 44 helper[arr[i]]++; 45 } 46 for (int i = 0; i < N; i++) { 47 if (helper[i] == 2){ 48 System.out.println(i); 49 } 50 } 51 52 } 53 }
知识补充:与:都为1结果为1 & ;或:有一个为1结果为1 | ;异或:二者不同时结果为1 ^
异或可以理解为不进位加法。1+1 = 0, 0 + 0 = 0,1 + 0 = 1。
判断奇偶数 x&1 == 1 奇数; x&1 == 0 偶数。