第四章上机实践报告
1.实践题目
4-2 删数问题
2.问题描述
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
3.算法描述
先从第一位开始往后看,若出现逆序的情况,删掉逆序的前面那位,再重新开始往后看;若看到最后一位没有删够k个或者不存在逆序,则从最后一位开始删,直到删到k个。
while(k>0)
{
for(int i=0;i<n;i++)
{
if(a[i+1]<a[i]||i==n-1)
{
a.erase(i,1);
k--;
break;
}
}
}
4.算法时间及空间复杂度分析
时间复杂度:代码的主要算法部分有两层循环,循环的次数是k*n次,其中k表示要删除的位数,n表示整数a的位数,即时间复杂度为:O(kn)
空间复杂度:算法中定义了一个string型的数组,用来存储整数a的各个位数,即n位数,即空间复杂度为:O(n)
5.心得体会
起初做这道题,我是想定义一个函数来删除想要删除的数,但结果迟迟不对,于是我上网搜索string的有关删数方法,因而使用erase方法,大大简洁了代码长度。