算法第4章实践报告

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.心得:最开始对本道题的思路在纠结删最大的数还是其他,用这个思路一直行不通,经过结对编程讨论后发现思路是错的,得到正确思路之后开始完善代码。经过本次实践,明白编程之前要先思考题目的解法,如果思路一直是错的,可以和别人讨论得出自己的思路错在哪里再开始打代码,不然会把自己绕晕了。

posted @ 2018-11-30 16:15  速滑  阅读(119)  评论(0)    收藏  举报