思路从前到后优先删除较大元素
C++ 代码
// 去掉k位数字后最小
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
char stk[100003];
int main(){
int k;
string str;
cin>>str>>k;
stk[0]='0';
int top=1;//指向了栈顶元素的下一个位置
int n=str.size();
for(int i=0;i<n;i++){
int ch=str[i];
//弹出比当前字符大的栈顶元素,直到用完k或者满足上升条件
while(ch<stk[top-1]&& k){
--top;
--k;
}
stk[top++]=ch;
}
while(k){
top--;
--k;
}//未用完k次机会,从末尾继续弹出
int t=0;//定位开头第一个非零字符
while(t<top){
if(stk[t]=='0') t++;
else break;
}
if(t==top){//全是零
puts("0");
}else{
while(t<top) cout<<stk[t++];
}
return 0;
}