1. 實踐題目:卡了好久的」刪數問題「算法
2. 問題描述:app
給定n位正整數a,去掉其中任意k≤n 個數字後,剩下的數字按原次序排列組成一個新 的正整數。對於給定的n位正整數a和正整數 k,設計一個算法找出剩下數字組成的新數最小的刪數方案。函數
要求輸出最小數。如:給定a = 178543,k = 4,則輸出13。spa
3. 算法描述:設計
先上代碼code
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個。後面才摸索到該問題的正確貪心性質其實很簡單,就是把整個數字按位遍歷一下,若是後一位數比前一位數小就把前一位刪掉,從左刪到右直至刪夠。總體代碼實現不難,要想到這個費了點功夫。blog
4. 算法時間及空間複雜度分析:ip
嵌套最多層數的在delete函數,由於是while跟for兩層循環,因此時間複雜度是O(n2)。字符串
空間複雜度應該是O(1),由於沒有多開別的東西,僅使用了刪除操做。input
5. 心得體會:
貪心算法最重要的是找到貪心性質。在有些狀況下貪心性質很差找。
在使用本身最初的作法沒法AC時不要盲目屢次嘗試增長條件判斷,有可能算法是假的,考慮下從新設計算法。