一、方法一
(1)運用hashMap的方法

/* 解法2: (1)思路:這個可以可以使用一個Map,Map對應的鍵值key就是數組中的元素,value就是這個元素出現的次數。這樣我 通過一次遍歷數組中的元素,如果元素出現在map中,則將其對應的value加1,否則將元素添加到map中,這樣遍歷一遍數組,我們就可以得到數組中每個元素對應出現的次數,然后再通過遍歷一遍map,返回value為1對應的key就是我們需要求得元素。 (2)時間復雜度:因為首先需要遍歷一遍數組,時間開銷為O(n),構建完map后需要遍歷一遍map找到value為1的元素,而map的個數為n/2,時間開銷為O(n/2),所以總的時間開銷為O(n)。 (3)空間復雜度:因為需要建立一個map,而且最后map的大小為n/2,所以空間復雜度為O(n)。 */ public static void findNumsAppearOnce1(int[] arr) { //Map對應的鍵值key就是數組中的元素,value就是這個元素出現的次數 Map<Integer, Integer> hashMap = new HashMap<Integer, Integer>(); for (int i : arr) { if (hashMap.containsKey(i)) { hashMap.put(i, hashMap.get(i) + 1); //如果存在,value值加1 } else { hashMap.put(i, 1); //如果不存在,存入hashMap,value值等於1 } } //遍歷一遍map,返回value為1對應的key就是我們需要求得元素 Set<Integer> set = hashMap.keySet(); for (int i : set) { if (hashMap.get(i) == 1) { System.out.print(i+" "); } } }
(2)時間復雜度:O(n)
二、方法二
(1)運用異或運算符的方法

public static void findNumAppearOnce(int[] arr) { int result = 0; for (int i = 0; i < arr.length; i++) { result ^= arr[i]; } System.out.println(result);
(2)時間復雜度:O(n)
三、方法三
(1)二分查找法

public static int method(int[] arr) { int start = 0; //定義變量,記錄最小的索引 int end = arr.length - 1; //定義變量,記錄最大的索引 int mid = (start + end) / 2; //定義變量,記錄中間的索引 while ((arr[mid] == arr[mid - 1]) || (arr[mid] == arr[mid + 1])) { if ((arr[mid] != arr[mid - 1]) && (arr[mid] != arr[mid + 1])) {//與兩邊的數不等,break break; } else if (arr[mid] == arr[mid + 1]) { //中間值與右邊的值相等 if ((arr.length - 1 - mid + 1) % 2 == 0) { //加上mid對應的數后,右邊字數組的數為偶數 mid = 0 + (mid - 1) / 2; } else { mid = (mid + (arr.length - 1)) / 2; } } else { //中間值與左邊的值相等 if ((mid + 1) % 2 == 0) { //加上mid對應的數后,左邊字數組的數為偶數 mid = ((mid + 1) + (arr.length - 1)) / 2; } else { mid = (0 + mid) / 2; } } //判斷,到數組的兩端了,也break if (mid == 0 || mid == arr.length - 1) { break; } } return mid; //如果數組中有這個元素,則返回 }
(2)時間復雜度:O(NlogN)