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

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時不要盲目屢次嘗試增長條件判斷,有可能算法是假的,考慮下從新設計算法。

相關文章
相關標籤/搜索