藍橋杯基礎練習-找出唯一成對的數

BTLord小白工作室發表於2021-02-15

題目:  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

相關文章