算法第四章上机实践报告

实践题目

4-2 删数问题

 

问题描述

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

 

算法描述

用一个字符串记录输入的正整数。每一次删掉的数字是当前字符串从高位开始往后出现的第一个比它前面所有数字和它的后一位数字要大的那一位。确定要删掉哪一位数后,对那一个数字所在位置开始的每一位数进行再赋值(等于后一位),整数长度减一,这样就相当于删掉了一位数。

#include<iostream>
using namespace std;
int main()
{
    string a;
    cin>>a;
    int i, k;
    cin>>k;
    while(k>0){
        i=0;
        while(a[i]<=a[i+1]&&i<a.length()){
            i++;
        }
        while(i<a.length()){
            a[i]=a[i+1];
            i++;
        }
        k--;
    }
    i=0;
    if(a[0]=='\0') cout<<"0"<<endl;
    while(a[i]=='0'){
        i++;
    }
    while(i<a.length()){
        cout<<a[i];
    i++;
    }
    //cout<<a[1];
 
}

 

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

一共要删k位数,每删一次就要进行n次运算(包括比较和赋值),所有时间复杂度是O(kn)。整个程序用的一个长度位n的字符串,两个整型变量,所以空间复杂度是O(n)。

 

心得体会

每一次删除的是哪一位数其实不难想到,但是如何实现就要花一点时间,最难的就是想到如何删除一位,还有在输出结果时也要处理一些情况,如结果为0开头时不输出0。

 

posted @ 2019-11-15 19:23  miamigo  阅读(97)  评论(0编辑  收藏  举报