題目: 1-1000這1000個數放在含有1001個元素的陣列中,只有唯一的一個元素值重複,其它均只出現一次。每個陣列元素只能訪問一次,設計一個演算法,將它找出來;不用輔助儲存空間,能否設計一個演算法實現?
1 import java.util.Arrays; 2 import java.util.Random; 3 4 public class _01唯一成對的數 { 5 public static void main(String[] args) { 6 int N = 11; 7 int[] arr = new int[N]; 8 for (int i = 0; i < arr.length - 1; i++) { 9 arr[i] = i + 1; 10 } 11 //最後一個數,是隨機數 12 arr[arr.length - 1] = new Random().nextInt(N - 1) + 1; 13 //隨機下標 14 int index = new Random().nextInt(N); 15 swap(arr, index, arr.length - 1); 16 print(arr); 17 /* 18 採用異或的方法將重複的值找出(不使用輔助空間)*/ 19 int x1 = 0; 20 for (int i = 1; i <= N - 1; i++) { 21 x1 = (x1 ^ i); 22 } 23 for (int i = 0; i < N; i++) { 24 x1 = x1 ^ arr[i]; 25 } 26 System.out.println(x1); 27 // 使用輔助空間 28 System.out.println("=========="); 29 int[] helper = new int[N]; 30 for (int i = 0; i < N; i++) { 31 helper[arr[i]]++; // 將重複的數的重複次數在helper陣列裡自加 32 } 33 print(helper); 34 for (int i = 0; i < N; i++) { 35 if (helper[i] == 2) { 36 System.out.println(i); 37 break; 38 } 39 } 40 } 41 42 /** 43 * 將陣列的兩個值交換 44 * 45 * @param arr 46 * @param i 47 * @param j 48 */ 49 public static void swap(int[] arr, int i, int j) { 50 int tmp = arr[i]; 51 arr[i] = arr[j]; 52 arr[j] = tmp; 53 } 54 55 /** 56 * 列印陣列 57 * 58 * @param arr 59 */ 60 public static void print(int[] arr) { 61 System.out.println(Arrays.toString(arr)); 62 } 63 }
2021-02-15