1. 程式人生 > >演算法第四章實踐

演算法第四章實踐

1.實踐題目:刪數問題 

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

輸入格式:

第 1 行是1 個正整數 a。第 2 行是正整數k。

輸出格式:

輸出最小數。

3.演算法描述:(程式碼解析

在原正數序列中,依次尋找非遞增序列的首位數字(即S[i]>s[i+1]時的S[I]),將其刪去,依次迴圈至刪夠題目要求的個數

格外要注意的是:當留下的數字前面數字為0時(包括連續幾個零的情況),要做刪0操作(20到26行)

1int main()
2{
3char s[150];
4int n;
5
6cin >> s >> n;
7while(n > 0){
i8nt len = strlen(s);
9int i =0;
10while(i < len && s[i] <= s[i+1]){
11i++;
12}
13while(i < len){
14s[i] = s[i+1];
15i++;
16}
17n--;
18}
19int k;
20while(s[0] == '0'){
21k = 0;
22int len = strlen(s);
23while(k < len){
24s[k] = s[k+1];
25k++;
26}
27}
28if(strlen(s) == 0){
29cout<<0;
30}
31else{
32cout<<s;
33}

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

時間複雜度:題目要在長度為n的陣列中刪除K個數,需要進行K次迴圈,所需時間複雜度為O(nk),去零操作所需複雜度為O(n-k),因此最後時間複雜度為O(n)

空間複雜度:用了長為n的陣列進行儲存,空間複雜度為O(n)

5.此次上機,在這道題花費的時間較多,主要問題在於基礎不夠紮實,把問題複雜化,並且忽略了00的情況,在測試資料時出錯弄了很久,這也是算是一次學習吧,在和隊友的不斷探討互相指正的過程中學到了雙倍的知識