1. 程式人生 > >演算法第四章實踐報告 | 實踐題解

演算法第四章實踐報告 | 實踐題解

演算法第四章實踐報告

一、實踐題目:7-2 刪數問題

二、問題描述

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

 

三、演算法描述

1.解法一:參考連結如下

https://blog.csdn.net/cqs_experiment/article/details/16975003

2.解法二:對於給定的一串數字,每次刪除第一個左邊大於右邊的數字,若完全升序則刪除最後一個數字,刪除k次即可。輸出結果的時候注意去掉前導0

3.程式碼如下:

(1)刪除數字

while(s > 0) {
    i = 0;
    len = strlen(a);
    
    while (i < len && a[i] <= a[i+1]) {
        // 遍歷a[i],直到找出a[i] > a[i+1]的a[i] 
        i++;
    }
    while (i < len) {
        // 移動陣列元素 
        a[i] = a[i+1];
        i++;
    }
    s--;
    // 重新尋找 
}

(2)輸出不含前導0

i = 0
; len = strlen(a); while (a[i] == '0' && i < len) { i++; }

四、演算法時間及空間複雜度分析(含分析過程)

1.遍歷次數n x 遷移次數n,時間複雜度:O(n)

2.空間複雜度(只有原先儲存輸入資料的陣列):O(1)

 

五、心得體會(實踐收穫及疑惑總結)

1.實踐收穫:

這次實踐作業是在上課時間開放的,時間控制提高了程式設計的強度。

對於具有明顯的貪心選擇性質的題目,採用貪心演算法能快速解決問題,如題7-3

對於特定的貪心演算法,還可以從時間/空間複雜度入手對其進行優化,如題

7-1對於新陣列元素的記錄。

2.疑惑總結:

7-17-3較水,具有明顯的貪心選擇。個人感覺其實在做題的時候還需要嚴格證明一下貪心演算法的正確性。

 

六、參考連結

1.https://blog.csdn.net/plain_maple/article/details/53426867

2.https://www.cnblogs.com/xiaoying1245970347/p/4630399.html