1. 程式人生 > >演算法第4章實踐報告

演算法第4章實踐報告

1、實踐題目

7-2 刪數問題 (110 分)

2、問題描述

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

輸入格式:

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

輸出格式:

輸出最小數。

輸入樣例:

在這裡給出一組輸入。例如:

178543 
4 

輸出樣例:

在這裡給出相應的輸出。例如:

13

3、演算法描述
#include<iostream>
#include
<algorithm> #include<string.h> using namespace std; int main() { int m; int len,t=0; char ch[100]; cin >> ch >> m; t=m; len=strlen(ch); if(m>=len) { cout<<"0"<<endl; } while(m>0) { int i=0; while(i<len&&ch[i]<=ch[i+1
])//尋找順序,如果遇到逆序,就把後面的值往上牽動,用於去除區域性最大值 i++; for(int j=i; j<len; j++) ch[j]=ch[j+1]; m--; } int l=0; if(ch[0]=='0') { while(ch[l]=='0') l++; } for(int j=l; j<len-t; j++) cout<<ch[j]; cout<<endl; }

找到區域性升序中最大的數字,並將之後的數往前替換,迴圈n次,去掉n個區域性升序最大的數字,剩下的就是這個數字中最小的數的組合。

4、演算法時間及空間複雜度分析(要有分析過程)

時間複雜度:O(n),核心演算法就是去掉n個區域性升序的最大數的while迴圈,所以就是O(n)

空間複雜度:O(1),設定了t,儲存n,因為n會在while迴圈中作為計數器,t做計數器也可以;設定l,防止出現‘\0’。

5、心得體會

最苦惱的是怎麼得到一個最小的數,而且一開始理解錯了,以為是無序,就案例如果是378541,也是出現13的話該怎麼做,後來知道理解錯了,而且得到一個最小的數,其實是這串數字中最小數字的組合,那麼每次刪掉數留下來的數字之外的數,還要保持原有的順序,就想到了去除區域性升序的數字串的最大數字,然後迴圈n次,就可以去掉n個區域性迴圈的最大數。這個是我和我的夥伴一起想的最久的問題。