LeetCode 136:一度だけのデジタルシングルナンバーで表示されます

トピック:

与えられた空でない整数の配列、要素に加えて、一度だけ表示され、各要素の残りの部分は二回表示されます。要素のみに一度表示されていることを知るために。

与えられた空でない整数の配列、すべての要素が表示されます二回 1を除いて。その単一のものを探します。

説明:

あなたのアルゴリズムは線形時間複雑性を持っている必要があります。あなたはそれを達成するために余分なスペースを使用することはできませんか?

注意:

あなたのアルゴリズムは線形ランタイムの複雑さを持っている必要があります。あなたは余分なメモリを使用せずにそれを実装できますか?

例1:

输入: [2,2,1]
输出: 1

例2:

输入: [4,1,2,1,2]
输出: 4

問題解決のアイデア:

  • 配列には番号が一度だけ表示される前と後の2つの数の数が等しくない場合、ソートされています。
  • ハッシュマップ、数値のそれぞれのキー値、各数値の出現頻度の値。最後に、値を見つける=数1が返されます。
  • XOR XOR演算を直接評価します。追加のスペースはありません。

排他的論理和演算(XOR)問題解決が最もエレガントなソリューションである、追加のスペースを使用せずに、概念は次のとおりです。

  • 我々はビット0でXOR演算を行うと、まだこのビットを取得した場合
    • XOR 0 = A
  • 私たちは同じバイナリビットにXOR演算を行う場合は、返される結果はゼロです
    • XORのA = 0
  • XOR可換連想

コード:

ハッシュテーブルを持ちます:

Javaの:

周波数ハッシュマップ(文字列の出現頻度を計算するために使用されてもよいです)

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の:

1は、...を除いて試して...で、唯一の数が偶数である繰り返し反復要素の問題に適用されます。

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] #最后字典中只剩下一个键值对,返回其键值

(列の出現の頻度を計算するために使用)2、周波数マッピング辞書

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

Yihuo操作(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を参照してください。

高レベルのプログラミング言語の記号は、一般的にXOR演算を表します^

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

マイクロは注意をお待ちしております。手紙を公開。すべての番号を書き込むためのバグ愛を
_バグ

おすすめ

転載: www.cnblogs.com/zhangzhe532/p/11655409.html