算法第4章实践报告
1.实践题目
7-2 删数问题
2.问题描述
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
3.算法描述
#include <string.h> #include <iostream> using namespace std; int main() { char n[101]; int s,len,i; cin>>n>>s; while(s>0){ i = 0; len = strlen(n); //求出字符的长度 while(i<len&&n[i]<=n[i+1]) //定位到第一个非递减序列的数字 i++; while(i<len){//构成递减数列时,删除n[i],之后字符依次前移 n[i]=n[i+1]; i++; } s--; } i=0; len = strlen(n); while(n[i]=='0'&&i<len) i++; //从i=0开始遍历,直到不为0的那一位 if(i==len) cout<<'0';//如果i=len时还没有出现不为零的位,则该数为零。 else { for(i=i;i<len;i++)//找到不为0的那一位,当作首位,输出。 cout<<n[i]; } return 0; }
4.算法时间及空间复杂度分析
需用到一个空间去存储字符串,空间复杂度为O( n ).
每次删除一个数都需要遍历一遍字符串进行比较,最大需要时间 sn,所以时间复杂度为O( n ).
5.心得体会(对本次实践收获及疑惑进行总结)
一开始是想到将不符合要求的数字替换到后面,但是会出现一个情况这个已经删去的数字还会跟后面的进行比较,可能在最后还会把它输出,所以最好是直接替换掉。而且我们并没有考虑到如果字符串开头是‘0’的情况,我们直接就输出了,导致这个测试点一直过不了,后来请教了其他同学才注意到这个问题。
浙公网安备 33010602011771号