一題算法|找出只出現一次的數字

題目:給定一個非空整數數組,除了某個元素只出現一次之外,其他每一個元素均出現兩次,找出那個只出現了一次的元素。(leetcode-136題)

這道算法題在leetcode的難度爲簡單,這道題看上去跟去重差很少意思,就是將不重複的找出來,平頭哥首先想到的是簡單粗暴的雙層循環來解決這個問題,沒辦法就是這樣記幾控制不住記幾,使用洪荒之力控制住記幾後,還想出來了兩種辦法來解決這個問題,利用 maplist的特性來解決。網上果真是臥虎藏龍的地方,想出了用異或運算符來解決,然而平頭哥對這種解法一臉懵逼,沒辦法就是這麼的俗。下面平頭哥來說講本身的思路吧。java

雙層 for 循環實現

/** * 雙層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 實現

/** * 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裏面的就是隻出現了一次的元素。數組

利用Map實現

/** * 利用 hashmap 實現 * * @param nums * @return */
public static Integer mapSolution(int[] nums) {
    Map<Integer, Object> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        // 將值做爲&emsp;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

掃碼關注公衆號(搜索公衆號:平頭哥的技術博文)一塊兒交流學習唄

掃碼關注公衆號(搜索公衆號:平頭哥的技術博文)一塊兒交流學習唄
相關文章
相關標籤/搜索