【實踐】演算法第四章上機實踐報告
阿新 • • 發佈:2018-12-01
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 ifmy_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) 2122 # 把處理完的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時不要盲目多次嘗試增加條件判斷,有可能演算法是假的,考慮下重新設計演算法。