NOWCODER:保留最大的数

题目描述
给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。

输入描述:
输入为两行内容,第一行是正整数number,1 ≤ length(number) ≤ 50000。第二行是希望去掉的数字数量cnt 1 ≤ cnt < length(number)。

输出描述:
输出保留下来的结果。


解题思路:从左到右找第一次出现比后面小的数,找到后 i 就记录下这个数的位置,然后删除这个位置数字,例如87784201(i 记录第二个7位置),如没找到,i 值就是记录最后一个字符,这时其实是三种情况,全部相等或者从左到右递减,或者中间也可能有相等情况,反正这时s位置记录的数字是最右边最小的 例如:
987654321(i 记录1的位置)
77777777777(i 记录最后一个7的位置)
98877777666555(i 记录最后一个5的位置)
每次只删除一个数字,然后重头开始直到删除个数等于cnt,用while的优点是每次不用遍历完整个数列,遍历个数取决于从高位到低位每次满足删除条件的位置,删除一个后就进入下一次循环。

#include<iostream>
#include<string>

using namespace std;

int main(){
    string number;
    int i,cnt;

    while(cin >> number >>cnt){
        while(cnt--){
            int len=number.length();
            for(i=0; i<len-1; i++){
                //相邻数字相互比较
                if(number[i]<number[i+1]){
                    number.erase(number.begin()+i); //string的erase方法删除下标为i的数字
                    break;
                }
            }
            if(i == len-1) //如果i为最后一个数,则删除
                number.erase(number.end()-1);
            //i--;
        }
        cout << number <<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sinat_36192944/article/details/81131142