私の個人的なマイクロチャネルのパブリック番号: Microstrong
マイクロチャネル公共番号ID: MicrostrongAI
マイクロチャネル公共番号説明:Microstrong(バウアー)学生は主に学習プロセスにおける機械学習、深い学習、コンピュータビジョン、インテリジェントな対話システム関連のコンテンツ、共有の研究ノートを学びます!あなたの注意を楽しみにして、一緒に進捗状況を学習の交換を歓迎します!
します。https://www.zhihu.com/people/MicrostrongAI/activitiesほとんど家にページを知っています
トピックリンク:
件名の説明:
問題解決のアイデア:
(1)時間計算のための空間的複雑
宇宙複雑さと時間の複雑さ。
ACコードがあります。
# -*- coding:utf-8 -*-
class Solution:
# 返回[a,b] 其中ab是出现一次的两个数字
def FindNumsAppearOnce(self, array):
# write code here
num_dic = {}
result_list = []
for item in array:
if item in num_dic.keys():
num_dic[item] = num_dic[item] + 1
else:
num_dic[item] = 1
for item, count in num_dic.items():
if count == 1:
result_list.append(item)
return result_list
if __name__ == "__main__":
input_array = [2, 4, 3, 6, 3, 2, 5, 5]
sol = Solution()
print(sol.FindNumsAppearOnce(input_array))
Pythonのlist.count()関数を使用して、(2)、時間複雑です
# -*- coding:utf-8 -*-
class Solution:
# 返回[a,b] 其中ab是出现一次的两个数字
def FindNumsAppearOnce(self, array):
# write code here
result_list = []
for item in array:
count = array.count(item)
if count == 1:
result_list.append(item)
return result_list
XORを使用して(3)は、時間の複雑さ、考え、スペースの複雑さ
XORのコンセプトは: A、B二つの値が異なる場合、結果は排他的論理和です。、a、b値が同じであれば、排他的論理和の結果が0です。
これは、より困難な問題であり、非常に少数の人々はかつてインタビューの時に最適なソリューションと思ったプロンプトを表示する必要はありませんすることができます。候補者は数分後にアイデアを考えていないとき、一般的に、インタビュアーは、いくつかのヒントを与えるだろう。インタビュアーは言ったかもしれない:あなたはこの配列は一度だけ一つだけの数の表示されていると考えることができ、他の人がこの番号を見つける方法を、二回出現していますか?
どちらのトピックは、他の人が2回表示、(または2>は数字が一度だけ表示され強調されている私たちは:?自然のXOR演算の独自の排他的な数のどれを考えたり、ゼロに等しいということです。それは私たちが仕上げXORアレイに最初から各番号をオンにした場合、これらの数字はすべて異なるまたはオフセットの2のペアで来るので、その後、最終結果が正確数は、一度だけ表示されています。
この単純な問題を解決する方法を理解したいの後、我々は、元の質問に戻ってあなたが同じ考えを適用することができるかどうかを確認します。我々は、各サブアレイは、他の数値はペアで2回表示させながら数は、一度だけ表示され含まれるように元の配列は2つのサブアレイに分割されてみました。これは二つの配列に分割することができた場合は、それぞれ、我々は二つの数だけ、前のアプローチに基づいて、一度に表示されています。
XORの最初から最後まで、私たちの数の結果やXOR配列を回す各番号、最終的な結果は2つだけが表示され得ています。他の図は、すべての排他的またはオフセットで、二回出現しているので。これら二つの図のは確かに同じではないので、次にXOR結果は、バイナリ表現の結果の数が1に少なくとも一つ存在することをどの手段、確かにゼロではありません。我々は、n番目の位置と呼ぶ得られた数の第1ビット位置1を見つけます。今はないn番目のビットは、標準的なデジタル元の配列は、2つのサブアレイに分割されている1、各数が1であるNビットの第1サブアレイ、各桁の第2のサブ配列でありNビットは0です。当社の基準は、デジタルビットにグループ化されているので1または0の場合、確かにデジタル2の出現は、同じサブ配列に割り当てられています。2のいずれかで同じ番号が同じであるため、我々は元の配列は、2つのサブアレイに分割して持っているので、各サブアレイが含まれ、行くために2つのサブアレイに割り当てられた2つの同一の番号を置くことができません他の図は、二回登場していながら数字は、一度だけ表示されます。我々はすでに数字の配列に一つだけを見つける方法を知っている一度だけ表示され、これまでのすべての問題が解決されました。
例えば、と仮定すると、入力配列{2、4、3、6、3、2、5、5}。我々は、アレイXOR演算の各番号に入れ、その結果を2進数で表す場合0010です。我々は1の数の逆数に応じて2つに分割されている二番目の配列ではないので、最後から二番目のビットで得られたXOR結果は、1です。すべての数は1である持続するための第2の最初のサブアレイ{2、3、6、3、2}、及び全ての数の2番目に低い第二のサブアレイ{4、5、5}があります0。その後限り、これらの2つのサブアレイが発散しているかのように、あなたは最初の子が唯一の数値の配列に一度表示されます見つけることができることは6であり、第二のサブ配列は、数は4で1回だけ発生します。
全体のプロセスは、コードを書くことは難しいことではありません後、私ははっきりと思います。ここでは、コードACたです。
# -*- coding:utf-8 -*-
class Solution:
def FindNumsAppearOnce(self, array):
# write code here
if array == None or len(array) < 2:
return []
# 对数据进行异或运算
resultExclusiveOR = 0
for i in array:
resultExclusiveOR ^= i
# 在异或结果中找出从右向左第一个为1的索引
indexOf1 = self.FindFirstBitIs1(resultExclusiveOR)
num1 = 0
num2 = 0
for j in array:
if self.IsBit1(j, indexOf1):
num1 ^= j
else:
num2 ^= j
return [num1, num2]
def FindFirstBitIs1(self, num):
indexBit = 0
while num & 1 == 0:
num = num >> 1
indexBit += 1
return indexBit
def IsBit1(self, num, indexBit):
num = num >> indexBit
return (num & 1)
if __name__ == "__main__":
input_array = [2, 4, 3, 6, 3, 2, 5, 5]
sol = Solution()
print(sol.FindNumsAppearOnce(input_array))
参照:
[1]はオファー、シンセン勝。
[2]配列は、デジタル版-Javaアドレスに一度だけ表示されますオファー安全性を証明するために:https://www.bilibili.com/video/av88622216?from=search&seid=17735582839041767037