自己写的,没通过
#include<bits/stdc++.h>
using namespace std;
int main(){
char n[250],no[250],t[250],temp[250];
int wz[250],flag;
int s,g=0;
cin>>n>>s;
/*
if(strlen(n)<=s){ //如果输入的位数小于要删除的位数
cout<<'0';
return 0;
}
*/
for(int i=0;i<s;i++) //记录前s个值和下标
{
t[i]=n[i];
no[i]=i;
}
int i,m; //m记录前t[]数组前m位不变了
for(i=s;i<strlen(n);i++){
char min='a'; //min值为97
int wz;
for(int j=m;j<s;j++){ //分别进行判断
if(t[j]<min){
min=t[j];
wz=j; //记住最小值位置
}
}
if(n[i]<min){ //如果数组t里的所有值都比之后一个数大则结束循环
break;
}
else{
//cout<<t[wz]; //直接输出最小值
if(t[m]!=min)m++; //如果t[m]不等于最小值,则t[m]的值就不变了
temp[g++]=t[wz]; //记录结果
for(int j=wz;j<s-1;j++){ //将t[wz]后的值向前移一位
t[j]=t[j+1];
no[j]=no[j+1];
}
t[s-1]=n[i]; //将n[i]放到t[s-1]位,即最后一位
no[s-1]=i;
}
}
for(int k=i;k<strlen(n);k++) temp[g++]=n[k]; //余下的位数直接加到temp数组后面
int d=0,b=0; //b用于记录前置0位置
while(true){ //去掉可能存在的前置0
if(temp[d++]=='0')b++;
else break;
}
for(int l=b;l<g;l++) cout<<temp[l]; //输出结果
if(b>=g)cout<<'0'; //如果b大于等于temp数组长度,则说明结果为0
return 0;
}
思路:
从前往后找(st,s+i),找到最小的直接输出
st默认为第一个数,后面为前面最小之后的一个数
i的范围为需要最后输出结果的位数
需要考虑前置0的情况
#include<bits/stdc++.h>
using namespace std;
int main(){
char t[241];
int tt[241],s;
cin>>t>>s;
int len=strlen(t);
for(int i=1;i<=len;i++){
tt[i]=t[i-1]-'0'; //将字符转化为数字
}
bool f=0; //将f设为false
int mi,st=1;
for(int i=1;i<=len-s;i++){ //找len-s位
mi=10; //将m设为一个足够大的数,只要比9大都行
for(int j=st;j<=s+i;j++){ //找最小的
if(mi>tt[j]){
mi=tt[j];
st=j+1;
}
}
if(f||mi){
//如果f为true或者mi非0(一开始f为false,用于消去前置0)
if(mi) f=1; //如果mi非0,将f设为true,用于输出后面的0
cout<<mi;
}
}
if(!f) cout<<0; //如果f为flase,说明没有结果
return 0;
}
https://www.cnblogs.com/sxrekord/p/deletion_problem.html