LeetCode 136:只出現一次的數字 Single Number

題目:

給定一個非空整數數組,除了某個元素只出現一次之外,其他每一個元素均出現兩次。找出那個只出現了一次的元素。java

Given a non-empty array of integers, every element appears twice except for one. Find that single one.python

說明:算法

你的算法應該具備線性時間複雜度。 你能夠不使用額外空間來實現嗎?數組

Note:bash

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?app

示例 1:spa

輸入: [2,2,1]
輸出: 1
複製代碼

示例 2:設計

輸入: [4,1,2,1,2]
輸出: 4
複製代碼

解題思路:

  • 排序數組,若是某個數與先後兩個數均不相等則該數只出現一次。
  • 哈希映射,key 爲每一個數的值,value 爲每一個數出現的頻率。最後找到 value = 1 的數返回。
  • 異或運算,直接進行異或操做求值。不使用額外空間。

異或運算(XOR)解題是最優雅的解法,且不使用額外空間,其概念爲:code

  • 若是咱們對 0 和二進制位作 XOR 運算,獲得的仍然是這個二進制位
    • a XOR 0 = a
  • 若是咱們對相同的二進制位作 XOR 運算,返回的結果是 0
    • a XOR a = 0
  • XOR 知足交換律和結合律

代碼:

藉助哈希表:

Java:cdn

哈希映射頻率(可用於字符串出現頻率的計算)

class Solution {
    public int singleNumber(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            Integer count = map.get(num); //get() 方法獲取元素不存在時返回null
            count = count == null ? 1 : ++count; //count爲null 時證實元素不存在,則頻率改成1,不然count頻率+1
            map.put(num, count); //加入映射表
        }
        for (Integer num : map.keySet())
            if (map.get(num) == 1) return num; //返回頻率爲1的數
        return 0;
    }
}
複製代碼

Python:

一、藉助 try...except...,只適用於該題中重複元素重複出現次數爲偶數次。

class Solution(object):
    def singleNumber(self, nums):
        hash_map = {}
        for i in nums:
            try:
                hash_map.pop(i) # 嘗試移除該數
            except:
                hash_map[i] = 1 # 移除失敗證實字典內沒有該值,則添加到字典
        return hash_map.popitem()[0] #最後字典中只剩下一個鍵值對,返回其鍵值
複製代碼

二、字典映射頻率(可用於字符串出現頻率的計算)

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        hash_map = {}
        for num in nums:
            hash_map.setdefault(num, 0)
            hash_map[num] += 1 # 每次出現頻率加一
        for k, v in hash_map.items(): #二次遍歷返回頻率爲1的數
            if v == 1:
                return k
        return 0
複製代碼

亦或運算(XOR):

其處理邏輯能夠簡單理解爲:

輸入: [2 , 3 , 2 , 4 , 3] ,  初始化 result = 0

result = 0  XOR  2  =  2
result = 2  XOR  3  =  [2 , 3]
result =  [2 , 3]  XOR  2  =  3
result = 3  XOR  4  =  [3 , 4]
result = [3 , 4]  XOR  3  =  4

返回 result = 4
複製代碼

異或運算是位操做中最基本運算之一,以上是爲方便理解異或運算而簡化抽象的邏輯,若是想進一步瞭解位操做能夠參考Wiki百科。

高級程序設計語言異或運算表示符號通常是 ^

Java:

class Solution {
    public int singleNumber(int[] nums) {
        int result = 0;
        for (int num : nums)
            result = result ^ num;
        return result;
    }
}
複製代碼

Python:

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        result = 0
        for num in nums:
            result = result ^ num
        return result
複製代碼

歡迎關注微.信公.衆號愛寫Bug

_Bug
相關文章
相關標籤/搜索