劍指offer 09 陣列中重複的數字

2022-08-11 06:30:07 字數 1736 閱讀 6291

題目:

在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。 例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。

思路:1、因為所有數字都在0-n-1範圍內,將所有數排好序,若前乙個數等於後乙個數,就返回true

class

solution:

#這裡要特別注意~找到任意重複的乙個值並賦值到duplication[0]

#函式返回true/false

defduplicate(self, numbers, duplication):

#首先當然是特殊情況!

n =len(numbers)

if numbers == or n <= 1:

#找重複數字,n=1也返回false

return

false

numbers.sort() #排序

for i in range(0, n-1):

if numbers[i] == numbers[i+1]:

#前乙個和後乙個相等

duplication[0] =numbers[i]

return

true

elif numbers[i] < 0 or numbers[i] >=n:

#因為所有數字都在0到n-1的範圍內,所以數字不能小於0或大於n

return

false

return false

2、可以使用雜湊表。先從頭到尾掃瞄陣列,比對陣列中的值是否在雜湊表中存在,若不存在 -> 將該數加入到雜湊表中;若存在 -> 該數字就是乙個重複的數字

【雜湊表】我理解的是,乙個陣列,每個元素按照一定的雜湊函式,對應到雜湊表當中的某個位址中。-> 如果a元素在按照雜湊函式對應到位址的過程中,與b元素有衝突,那就要採用衝突處理方法。

*python中雜湊表的例子:dict、set:

class

solution:

#這裡要特別注意~找到任意重複的乙個值並賦值到duplication[0]

#函式返回true/false

defduplicate(self, numbers, duplication):

#首先當然是特殊情況!

n =len(numbers)

if numbers == or n <= 1:

#找重複數字,n=1也返回false

return

false

#python中set有用到雜湊表,但是集合中只儲存key,不儲存value

usedhash =set()

for i in

range(0, n): #到n

if numbers[i] < 0 or numbers[i] >=n:

return

false

if numbers[i] not

inusedhash:

usedhash.add(numbers[i])

else

: duplication[0] =numbers[i]

return

true

return false

用例:有乙個或多個重複數字的陣列

沒有重複數字的陣列

空陣列

劍指offer 09 跳台階

題目 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 對於本題,前提只有 一次 1階或者2階的跳法。a.如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n 1個台階,跳法是f n 1 b.假定第一次跳的是2階,那麼...

劍指offer 09 雙棧實現佇列

棧 先進後出 佇列 先進先出 列表元素 元素1 元素2,元素3 棧的格式 棧底 棧中 棧頂 佇列格式 隊首 隊中 隊尾 操作1 佇列的插入操作 插入元素4 相當於棧頂插入元素4,即對應於入棧操作。操作2 佇列刪除元素1,相當於在隊首刪除元素1,即刪除棧底元素1 但是,棧的插入與刪除都是在棧頂完成的,...

劍指offer 09 斐波那契數列

寫乙個函式,輸入n,求斐波那契數列的第n項。思路 遞迴 順序求 公式。遞迴 重複的節點數會隨著n的增大而急劇增加,這意味著計算量會隨著n的增大而急劇增大。事實上,用遞迴的方法計算的時間複雜度是以n的指數的方式遞增的。順序 從下往上計算,首先計算f 0 和f 1 算出f 2 再根據f 1 和f 2 算...