1. 程式人生 > >【實踐】演算法第四章上機實踐報告

【實踐】演算法第四章上機實踐報告

1. 實踐題目:卡了很久的”刪數問題“

2. 問題描述:

給定n位正整數a,去掉其中任意k≤n 個數字後,剩下的數字按原次序排列組成一個新 的正整數。對於給定的n位正整數a和正整數 k,設計一個演算法找出剩下數字組成的新數最小的刪數方案。

要求輸出最小數。如:給定a = 178543,k = 4,則輸出13。

3. 演算法描述:

先上程式碼

 1 # 進行刪數操作
 2 def delete(my_list, times):
 3     while times > 0:
 4         for j in range(1, len(my_list)):
 5             if
my_list[j] < my_list[j-1]: 6 del my_list[j-1] 7 times -= 1 8 break 9 return my_list 10 11 12 # 輸入原正整數a和刪除位數k 13 a = input() 14 k = int(input()) 15 num = [] 16 for i in a: 17 num.append(int(i)) 18 19 # 呼叫函式進行處理 20 num = delete(num, k) 21
22 # 把處理完的num列表轉換為字串型別輸出 23 output = "" 24 for i in num: 25 output += str(i) 26 # 處理output中所含的前導零 27 print(output.lstrip("0"))

一開始沒有發現規律,用字串切片做的,寫了特別多個if...elif...else語句判斷,結果10個點只過了3個。後面才摸索到該問題的正確貪心性質其實很簡單,就是把整個數字按位遍歷一下,如果後一位數比前一位數小就把前一位刪掉,從左刪到右直至刪夠。整體程式碼實現不難,要想到這個費了點功夫。

4. 演算法時間及空間複雜度分析:

巢狀最多層數的在delete函式,因為是while跟for兩層迴圈,所以時間複雜度是O(n2)。

空間複雜度應該是O(1),因為沒有多開別的東西,僅使用了刪除操作。

5. 心得體會:

貪心演算法最重要的是找到貪心性質。在有些情況下貪心性質不好找。

在使用自己最初的做法無法AC時不要盲目多次嘗試增加條件判斷,有可能演算法是假的,考慮下重新設計演算法。