資料結構與演算法 學習引入

2022-07-18 09:21:14 字數 2084 閱讀 8378

找到丟失的數字:現在你手上有n-1個數字,這些數字的範圍是[1,n],且這n-1個數字中沒有重複的數字。有上述條件可知:你手上的數字缺了乙個。請編寫一段高效的找到缺失數字的**。

此題是一道比較老的資料結構與演算法考題,首先,在解答該題時,要進行一些題目的分析,題目分析我們主要做些什麼呢?

要弄清楚,這n-1個數字是排好序了的嗎?

該題有哪些解法思路呢?

要通過分析時間複雜度和空間複雜度說明那種解法最優呢?

最優解法的**如何實現?

能不能寫出測試用例呢?

list.sort()
演算法時間複雜度 =  排序的時間複雜度() + 二分查詢的時間複雜度(log)

演算法時間複雜度 =  排序的時間複雜度() + 二分查詢的時間複雜度(n)

思路:sum = 1+2+3+....+n = n(n-1)/2

sum = sum - list[i]

num = sum   //最後作差剩下的數

有n個抽屜,每個抽屜裡面放乙個數,最後有空的抽屜就應該裝缺失的數。

def findmissingnumber(nums):

chouti = [ 0 for i in range(len(nums)+1)] # n(列表長度加1)個抽屜裡面全為空

for n in nums:

chouti[ n-1] = 1 # 將數放到對應的抽屜,並標記該抽屜也有數

return chouti.index(0)+1 # 獲取空元素的下標並加1,因為下標是從0開始的

print(findmissingnumber([1,3,5,6,4,7]))

異或的知識:

相同為0, 不同為1

0 ^ 0 = 0 ;

0 ^ 1 = 1 ;

1 ^ 0 = 1 ;

1 ^ 1 = 0 ;

8 ^ 3 = 1011

1000

0011

1011

a ^ a = 0

a ^ 0 = a

1010

1010

= 000

1010

0000

= 1010

a ^ b ^ c ^ d = 0 //表示二進位制數最後一位1的個數為偶數

有了上面的思想, 我們可以將n-1 個數

a```` , a````   ....    ,a````

1,   2 ,   ....   , n

進行逐位異或,最後選出異或結果不為0的數。

def findmissingnumber(nums):

new_nums = sorted(nums)

n = len(new_nums)

for i in range(1,n+2):

if i^ new_nums[i-1] != 0:

print(f"the missing number is : " )

break

findmissingnumber([1,3,2,6,4,7])

資料結構與演算法學習

我想重新學習一下資料結構與演算法,打好基礎。to measure is to know.我們用演算法複雜度t n 來表示演算法的效率,效能。t n 的取值 所有問題規模為n的問題例項中,將他們的計算成本進行總體的比較,取出最壞情況下的值。有幾點需要catch,1.演算法執行的時間,會根據程式語言,作...

資料結構與演算法學習筆記

演算法基礎篇 第一章 演算法概述 首先了解一下基本的概念 1.1 什麼是演算法呢?從字面意義上理解,演算法就是用於計算的方法,用這種方法達到預期的結果。通俗的講,演算法可以理解為乙個完整的解題步驟,由一些基本的運算和規定的運算順序組成。通過這樣的解題步驟可以解決特定的問題。演算法可以抽象出5個特徵 ...

資料結構與演算法學習二

1 用js中object物件模擬集合set的資料結構 set集合中的資料結構 s s 即集合中的鍵 值相同。故,可令object物件中的鍵 值相同,來模擬set集合及其中的方法,如下 用js中object模擬實現集合set資料結構 es6中有set類,避免混淆這裡用set2 var set2 fun...