1. 实践题目

4-2 删数问题

 

2. 问题描述

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

 

3. 算法描述

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

#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];
 
}

 

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

时间复杂度是O(kn), 空间复杂度是O(n)。

 

5. 心得体会

一开始做删数问题还很是有很多疑惑,我是跟队友交流谈论过后才慢慢理解,这个算法题做的不是很好,还有更多的提升空间。

posted on 2019-11-19 23:38  周灏宇  阅读(140)  评论(0)    收藏  举报