题目描述
给定一个十进制的正整数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;
}