這道算法題在leetcode
的難度爲簡單,這道題看上去跟去重差很少意思,就是將不重複的找出來,平頭哥首先想到的是簡單粗暴的雙層循環來解決這個問題,沒辦法就是這樣記幾控制不住記幾,使用洪荒之力控制住記幾後,還想出來了兩種辦法來解決這個問題,利用 map
、list
的特性來解決。網上果真是臥虎藏龍的地方,想出了用異或運算符來解決,然而平頭哥對這種解法一臉懵逼,沒辦法就是這麼的俗。下面平頭哥來說講本身的思路吧。java
/** * 雙層for循環 * * @param nums * @return */
public static Integer forSoution(int[] nums) {
for (int i = 0; i < nums.length; i++) {
//相同個數
int equalCount = 0;
for (int j = 0; j < nums.length; j++) {
if (nums[i] == nums[j]) {
equalCount += 1;
}
}
// 除自己外沒有其餘相同的數字了
if (equalCount == 1)
return nums[i];
}
return -1;
}
複製代碼
咱們藉助一個臨時變量來作這道題目,利用雙層循環來統計一個本身相同個數的元素,由於是雙層遍歷,因此確定有一個元素與本身相同,也就是元素本身自己。也就是說相同個數等於1就是沒有相同的元素,即該元素就出現了一次。這樣咱們就找出來了只出現一次的元素。算法
/** * list * * @param nums * @return */
public static Integer listSolution(int[] nums) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
// 利用list刪除返回true的特性
if (!list.remove(Integer.valueOf(nums[i]))) {
list.add(Integer.valueOf(nums[i]));
}
}
if (list.size() == 1) {
return list.get(0);
}
return -1;
}
複製代碼
由於list.remove()
方法返回值爲true
,因此咱們能夠利用這個特性來解決這個問題。咱們先實例化一個空的list
集合,在遍歷數組時,咱們先調用list.remove()
方法來刪除該值。若是刪除成功,說明該值已經重複了。若是刪除不成功,就說明在list
中沒有找到,則咱們將該值添加到list
裏,將全部元素遍歷完以後,留在list
裏面的就是隻出現了一次的元素。數組
/** * 利用 hashmap 實現 * * @param nums * @return */
public static Integer mapSolution(int[] nums) {
Map<Integer, Object> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
// 將值做爲 map 的key,若是map包含該key就刪除該key
if (map.containsKey(nums[i])) {
map.remove(nums[i]);
} else {
map.put(nums[i], 1);
}
}
if (map.keySet().size() == 0 || map.keySet().size() > 1) {
return -1;
}
return map.keySet().iterator().next();
}
複製代碼
map
提供了一個containsKey()
方法來判斷傳入的key
是否存在map
中,利用這個特性也能解決這個問題。咱們先實例化一個空的HashMap
,遍歷數組,判斷數組的值是否做爲key
存在map
中,若是存在,則將這個key
移除,若是不存在,則將這個值做爲key
添加到map
中,map
的值隨意。遍歷完以後,map
中的key
就是隻出現了一次的元素。學習
/** * 摘抄自網上,沒看懂 異或運算 * * @param nums * @return */
public static Integer xorSolution(int[] nums) {
int ans = nums[0];
if (nums.length > 1) {
for (int i = 1; i < nums.length; i++) {
ans = ans ^ nums[i];
}
}
return ans;
}
複製代碼
這個實現摘抄自網上,平頭哥是真心沒看到,具體怎麼實現的,咋也不知道爲何,咋也不敢問。spa
看完平頭哥的實現,小夥伴們是否是有更好的實現方式呢?別藏着掖着了,在留言區裏跟小夥伴們分享你的想法吧。code