Leetcode) Single Number


Top Interview Questions
Easy Collection
Link of Problem
LEVEL : 🌕 🌕 🌑 🌑 🌑 (下)
EasyCollectionの5番目の問題Single Numberを解いた
これは重複していない問題で、一人だけが存在する数字を探しています.
前の問題の大部分は重複データ削除または重複チェックなので、他の問題の方法を使用する可能性があります.でも特別な方法で紹介したいので持ってきました
まず,基本手法からコードを紹介する.

1𗞚𗞚第1の方法


以前、重複データがあるかどうかを調べるためにいくつかの論理を変更しました.numsに数字がある場合は、すぐにその数字を返します.
より高い数字であれば、まずsortedを行い、その後、両方の数字が同じかどうかを確認するように論理を記述する.
インデックスの数がindex+1の数と同じ場合は、確認された数を再チェックしないようにindex+2を使用します.2つの数値が等しくない場合、返される数値は一意の数値です.
しかし、nums末尾の数字が一意であり、nums末尾の数字が奇数である場合、while条件により末尾の数字を特定することはできない.しかし、この数字は明らかに独自に存在するので、whileゲートを無事に通過すれば、returnはnumの最後の数字です.
func singleNumber(_ nums: [Int]) -> Int {
    guard nums.count > 1 else { return nums[0] }
    
    let num = nums.sorted()
    var index = 0
    
    while index < nums.count-1  {
        if num[index] == num[index+1]{
            index += 2
        } else {
            return num[index]
        }
    }
    
    return num[nums.count-1]
}
この方式は動作が遅いが、メモリの面では優れている.

2▼▼▼第1の方法


これはコレクションを使用する問題で、メモリの面ではよくありませんが、問題では重複することがよくあります.
まずSetを作成し、その後、numsの数字を有する場合は値を削除し、ない場合は値を挿入する論理を実装する.
私はコードよりも理解しやすく、実行時も以前より速いです.containsを消しただけなので一人分の数字は出られませんこれを用いて,for文を迂回し,配列内の最初の要素を返す.
func singleNumber(_ nums: [Int]) -> Int {
    var tempNums = Set<Int>()
    for value in nums {
        if tempNums.contains(value) {
            tempNums.remove(value)
        } else {
            tempNums.insert(value)
        }
    }
    return tempNums.first!
}

3ππ第1の方法


runtimeは最高の方法であり、思いがけない方法でもある.

まずはハーモニーをお見せします
func singleNumber(_ nums: [Int]) -> Int {
    var result = 0
    for num in nums {
        result ^= num
    }
    return result
}
コードは非常に短く、簡潔です.
しかし、私は最初から分かりません.この友達がどういう意味なのか全く分かりません.

^=何ですか?

^=って知ってる?
私たちが知っているXOR(^)は、比較された2つの値のうち1つだけが本当ですが、それは本当を返します.OR(||)とは異なり、XORはTrueを返すには2つの異なる値が必要です.
一言でOR1(true) ^ 0(false) = 1(true)^=を表す.
2つの値のresult = result ^ numが結果として入力されます.

^=でどうやって問題を解きますか?


私も最初は^=繰り返しと何か関係があったので、その方法を使いました.たまたまやっておけばよかったかな?
そう思うよ
しかしXORの意味を理解すれば、完全にそのような方法で解くことができます.
次に例を示します.XORです
1つ目が1ならnums = [1, 2, 3, 2, 3]2入ると0 ^ 1 => 0000 ^ 0001 = 0001(1)3入ると1 ^ 2 => 0001 ^ 0010 = 0011(3)2入ると3 ^ 3 => 0011 ^ 0011 = 0000(0)3入ると0 ^ 2 => 0000 ^ 0010 = 0010(2)最終的には正解が出てくる2 ^ 3 => 0010 ^ 0011 = 0001(1)は、同じ位置に繰り返される値を0とし、異なる値を1とする.
だから2つの数字を繰り返すとXORという0にしかなりません
最終的には、消去可能な値のない数値が繰り返されている場合にのみ生存します.
その原理で問題を解決した.0010(2) ^ 0010(2) = 0000(0)XORNORなど、私はこれらのものを使って何をするか考えたことがありません.こんなに簡単に解決しました.本当に不思議です本当に勉強しなければならないことがたくさんあります.まだ長い道のりがあります.