1.实践题目
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
第 1 行是1 个正整数 a。第 2 行是正整数k。
输出最小数。
2.问题描述
去掉k 个数后,剩下的数字按原次序排列组成一个新 的正整数。
3.算法描述(说明你的贪心策略,并且参考会场安排问题,利用反证法证明贪心选择和最优子结构性质)
输入数据可能过大,所以用char a[]存储数据。
运用贪心算法,对整数循环扫描,
当前一位比后一位大时,将当前位删除,将后面的数整体向前移动,
若所有数字按照升序排列,则删除最后一位。
!要将字符串前导的0删除掉
!当删数后得到的字符串全为0时,只输出一个0
#include<iostream>
using namespace std;
int main(){
string a;
int i, k;
int length;
cin >> a >> k;
length = a.size();
while(k-- > 0){
i = 0;
length = a.size();
while(a[i] <= a[i + 1] && i < length){
i++;
}
while(i < length)
{
a[i] = a[i+1]; //记录前导0的个数
i++;
}
}
length = a.size();
i = 0;
while(a[i] == ‘0‘)
i++;
if(i > 0 && i == length - 1){ //删数后数组全为 0
cout << "0";
}
else{
while(i < length)
{
cout << a[i];
i++;
}
}
}
4.算法时间及空间复杂度分析(要有分析过程)
时间复杂度:在有n个数字的数组中删除k个数,进行k次扫描,时间复杂度为O(kn)。
空间复杂度:运用了一个字符型数组进行存储,故空间复杂度为O(n)。
5.心得体会(对本次实践收获及疑惑进行总结)
要更多的注意处理输出字符串。
简化代码避免不必要重复
原文:https://www.cnblogs.com/qq1065928103/p/11850764.html