删数问题
思路:
假设输入12435863 3
S是3,就进行3次比较,从左到右找一个数,这个数左边比他小,右边比他小,删掉他自己,因为如果这个时候删掉它前面的数或者后面的数的话,这个大的数就往前了,露出来了,使得整体变大了,比如12435863,第一次删掉4,第二次删掉8,第三次删掉6。
代码:
import java.util.Scanner;
public class seventytwo {
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int N=reader.nextInt();
int S=reader.nextInt();
int p=N;
String s=String.valueOf(N);
int k=s.length();
int[] a=new int[k+1];//让3002这种2与-2比较一下,删去2
a[k]=-2;//最后一位:-2
for(int i=k-1;i>=0;i--) {//提出各位,因为正常是反序读入,我们把for逆过来就变成正序了
if(p!=0) {
a[i]=p%10;
p=p/10;
}
}
int j=1;
for(int i=0;i<S;i++) {
j=j-1;//j=j-1是为了降低时间复杂度,每次比较不是都从a[0]开始,是左退一位再往后比较
for(j=0;j<=k-1;j++) {
int w=j+1;
if(a[w]==-1) {
w++;//遇到下一位为-1的话,右边的数右移一位
}
if(a[w]!=-1&&a[w]!=0&&a[j]>a[w]) {//a[w]!=0控制3后面即使是0也不删去3
a[j]=-1;
break;
}
}
}
for(int i=0;i<k;i++) {
if(a[i]!=-1) {
System.out.printf("%d",a[i]);
}
}
}
}
/*
12435863 3
*/
/*
3002 1
*/
/*
60005727 2
*/
/*
3002 2
*/
运行结果: