首先,删数和添加数是一样的,我们可以将思路转变为添加数字。
每次添加数字都是一段数字的最小值。
我们看以下例子:
213
如果每次都添加最小值,则会输出21,显然不是我们想要的13。
所以我们在找到一个最小值时,要首先在这个最小值的右边开始添加,当右边没有数字的时候,从左边找。
首先找到1,找右边的3,才能形成我们需要的13。
#include "iostream"
#include "stack"
using namespace std;
//找左边
int findMinPos(string t,int lo,const bool bl[]){
if(lo+1==t.length() || bl[lo+1]) return -1;
char min = t[lo+1];
int pos = lo+1;
for(int i=lo+2;i<t.length();i++){
if(bl[i]) break;
if(t[i] < min) {
min = t[i];
pos = i;
}
}
return pos;
}
//找右边
int findMinPos_(string t,int lo,const bool bl[]){
if(lo==0 || bl[lo-1]) return -1;
char min = t[lo];
int pos = lo;
for(int i=lo-1;i>-1;i--){
if(bl[i]) break;
if(t[i] < min) {
min = t[i];
pos = i;
}
}
return pos;
}
int main(){
string a;
int k;
cin >> a >> k;
stack<int> num;//用于存放当前找到哪了
bool pos[a.length()];//各个找到的位置
for(int i=0;i<a.length();i++) pos[i] = false;//初始化
if(a.length()==k) return 0;//删完就直接结束吧
int temp = findMinPos(a,0,pos);//找第一个
pos[temp]= true;
num.push(temp);
int count = 0;
while(count!=a.length()-k-1){
temp = num.top();
int temp1= findMinPos(a,temp,pos);
if(temp1==-1){//左边找不到找右边
temp1 = findMinPos_(a,temp,pos);
if(temp1==-1){
num.pop();//没找到就直接不找当前位置,去找上一个位置的右边。
continue;
}
}
//找到就把当前位置记下,从当前位置开始找。
count++;
num.push(temp1);
pos[temp1] = true;
}
for(int i=0;i<a.length();i++) if(pos[i]) cout << a[i];
return 0;
}