1.实践题目:最小删数问题
2.问题描述:给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
3.算法描述:
#include<iostream> using namespace std; string n; //定义字符串n int s; main() {cin>>n>>s;int len=n.length(); while(s--)for(int i=0;i<len;i++) if(n[i]>n[i+1]||i==len-1) //删除遇到的第一个递减序列的第一个数字(若整个字符串为非递减序列,则删去末尾的数字) {n.erase(i,1); //把当前字符从字符串中删除break; //不可省略,否则字符串会多删字符 }while(n[0]=='0'&&n[1]) //去掉前缀0,并至少保留1个数字n.erase(0,1); //删去当前字符串开头的'0'cout<<n; //输出字符串 }
4.算法时间和空间复杂度分析:
代码中只用了一个数组来储存字符串。所以空间复杂度为O(n);时间复杂度为O(n²);
5.心得:最开始对本道题的思路在纠结删最大的数还是其他,用这个思路一直行不通,经过结对编程讨论后发现思路是错的,得到正确思路之后开始完善代码。经过本次实践,明白编程之前要先思考题目的解法,如果思路一直是错的,可以和别人讨论得出自己的思路错在哪里再开始打代码,不然会把自己绕晕了。