算法第4章实践报告
一.
7-2 删数问题
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
输入格式:
第 1 行是1 个正整数 a。第 2 行是正整数k。
输出格式:
输出最小数。
二
代码实现:
#include<iostream> using namespace std; int main(){ string str; int n ; int i ,len; cin>>str>>n; while(n--){ i=0; len=str.size(); while(str[i]<=str[i+1]&&i<len)i++; while(i<len) { str[i]=str[i+1]; i++; } } len = str.size(); i = 0; while(str[i]=='0') i++; if(i<len) { while(i<len) { cout<<str[i]; i++; } } }
算法思想:从字符串从前往后寻找一个递增序列,之后将该数列的最大数删去,即将后续数字前移,覆盖该数字。用i指向最大数值的位置,直到删去的数字即覆盖的数字达到n,循环停止。之后输出最小数。
时间复杂度:代码的主要算法部分有两层循环,循环的次数是k*n次,其中k表示要删除的位数,n表示整数a的位数,即时间复杂度为:O(kn)
空间复杂度:算法中定义了一个char型的数组,用来存储整数a的各个位数,即n位数,即空间复杂度为:O(n)
三.总结反思
这次编程中,我用字符串接受正整数,输出后字符串后几位都为空格,我以为输出是133333,结果输出全为空格,后来我发现数字前移过程中,将字符串最后的空格带入字符串,使我明白原因。