Leetcode) Single Number
Top Interview Questions
Easy Collection
Link of Problem
LEVEL : 🌕 🌕 🌑 🌑 🌑 (下)
EasyCollectionの5番目の問題Single Numberを解いた
これは重複していない問題で、一人だけが存在する数字を探しています.
前の問題の大部分は重複データ削除または重複チェックなので、他の問題の方法を使用する可能性があります.でも特別な方法で紹介したいので持ってきました
まず,基本手法からコードを紹介する.
以前、重複データがあるかどうかを調べるためにいくつかの論理を変更しました.
より高い数字であれば、まず
インデックスの数がindex+1の数と同じ場合は、確認された数を再チェックしないように
しかし、
これはコレクションを使用する問題で、メモリの面ではよくありませんが、問題では重複することがよくあります.
まずSetを作成し、その後、
私はコードよりも理解しやすく、実行時も以前より速いです.
runtimeは最高の方法であり、思いがけない方法でもある.
まずはハーモニーをお見せします
しかし、私は最初から分かりません.この友達がどういう意味なのか全く分かりません.
私たちが知っている
一言で
2つの値の
私も最初は^=繰り返しと何か関係があったので、その方法を使いました.たまたまやっておけばよかったかな?
そう思うよ
しかし
次に例を示します.
1つ目が1なら
だから2つの数字を繰り返すと
最終的には、消去可能な値のない数値が繰り返されている場合にのみ生存します.
その原理で問題を解決した.
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つの異なる値が必要です.一言で
OR
1(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)
、XOR
、NOR
など、私はこれらのものを使って何をするか考えたことがありません.こんなに簡単に解決しました.本当に不思議です本当に勉強しなければならないことがたくさんあります.まだ長い道のりがあります.Reference
この問題について(Leetcode) Single Number), 我々は、より多くの情報をここで見つけました https://velog.io/@yoonah-dev/Leetcode-Single-Numberテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol