算法第4章实践报告

1.实践题目

  7-2 删数问题

2.问题描述

  给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。

3.算法描述

#include <string.h>
#include <iostream>
using namespace std;
int main()
{
    char n[101];
    int s,len,i;
    cin>>n>>s;
    while(s>0){
        i = 0;         
        len = strlen(n);  //求出字符的长度 
        while(i<len&&n[i]<=n[i+1])   //定位到第一个非递减序列的数字 
            i++;
        while(i<len){//构成递减数列时,删除n[i],之后字符依次前移
         n[i]=n[i+1];
         i++;
        }       
        s--;        
    }
    i=0;
    len = strlen(n);
    while(n[i]=='0'&&i<len) i++; //从i=0开始遍历,直到不为0的那一位
    if(i==len) cout<<'0';//如果i=len时还没有出现不为零的位,则该数为零。
    else {
        for(i=i;i<len;i++)//找到不为0的那一位,当作首位,输出。
            cout<<n[i];
    }
    return 0;
 
}

 

4.算法时间及空间复杂度分析

  需用到一个空间去存储字符串,空间复杂度为O( n ).

  每次删除一个数都需要遍历一遍字符串进行比较,最大需要时间 sn,所以时间复杂度为O( n ).

5.心得体会(对本次实践收获及疑惑进行总结)

  一开始是想到将不符合要求的数字替换到后面,但是会出现一个情况这个已经删去的数字还会跟后面的进行比较,可能在最后还会把它输出,所以最好是直接替换掉。而且我们并没有考虑到如果字符串开头是‘0’的情况,我们直接就输出了,导致这个测试点一直过不了,后来请教了其他同学才注意到这个问题。

posted @ 2018-12-02 11:58  lasia_LWL  阅读(104)  评论(0)    收藏  举报