Huawei マシンのテスト - 配列内のさまざまな数値を見つけます

配列内のすべての数値が同じで、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)

おすすめ

転載: blog.csdn.net/weixin_44758107/article/details/127633719