配列内のすべての数値が同じで、1 つだけが異なることがわかっているので、その数値を見つけます
ここでは 3 つの方法が示されていますが、最初の 2 つは考えるのが簡単ですが、3 つ目は XOR 演算の理解が必要です。
解決策 1 (時間の複雑さが高い)
アイデア: for ループの 2 層。数値がそれ自体と同じ数値に到達しない場合は、この数値を返します。それ以外の場合は、ループを終了し、次の番号のトラバースを続けます。
時間計算量: O( n 2 n^2n2 )
空間の複雑さ: O(1)
解決策 2 (空間の複雑性が高い)
アイデア: 辞書を使用します。辞書のキーに数字が含まれていない場合は、その数字を辞書に追加します。そうでない場合は、キーと値を削除します (任意の値、使用されていません)。最終的に、辞書にはキーと値が 1 つだけ残ります。 、キーを出力します。
時間計算量: O(n)
空間計算量: O(n)
解決策 3 (最良)
アイデア: XOR 演算を使用します。2 つの値 a と b が同じでない場合、XOR の結果は 1 になります。a と b の値が同じ場合、XOR の結果は 0 になります (ここで、a と b は 0 または 1 を指します)。XOR には重要な機能があり、数値と 0 を XOR した結果はその数値のままです。XOR の特性を踏まえて、それを解析してみましょう。配列 [1, 2, 3, 4, 3, 2, 1] があります。配列と XOR を 1 つずつたどっていきます。1, 2, and なので、 3 つは同じで、結局はすべて 0 です。結局、0 は排他的か、4 は 4 に等しいか、結果は簡単に得られます。(次の記事の高度な質問: 配列内の 2 つの異なる数値を見つける)
スウィフトコード:
func findDifferentNum(_ array: [Int]) -> Int{
var res = 0
for i in 0..<array.count{
res = res ^ array[i]
}
return res
}
時間計算量: O(n)
空間計算量: O(1)