这一题我被字符串与整型数之间的运算卡住了,花了好多时间
经过研究
假设 char temp='b'
(char)(temp-'1')得到的不是'a'而是temp的ASCII-1的ASCII后得到的ASCII对应的字符,一般是乱码或者不可见
要想得到'a'
我们应当进行的操作是
(char)(temp-1)得到的是'a'
=================================
接下来讲讲这道题的做法
这是一题贪心+滑动窗口
我们要确定第i位的最优解,一般是从i开始,到Math.min(i+9,n-1)为止,因为有超出索引的可能,,所以要求最小值
首先在这个范围内,确定哪一个字符是最优解,并且记录它的位置
再进行移位操作,把这个最优解从它原本的位置移动到第i位,在这期间不断与前面的值进行交换
在最后把最优解赋值给s[i],这样就可以避开移位过程中不停减一,不停减一是无效操作,因为后面会覆盖它
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int t=scanner.nextInt();
while(t-->0) {
String string=scanner.next();
char s[]=string.toCharArray();
for (int i = 0; i < s.length; i++) {
int best_val=s[i]-'0';
int best_pos=i;
for (int j = i; j < Math.min(i+10, s.length); j++) {
if(s[j]-'0'-(j-i)-best_val>0) {
best_val=s[j]-'0'-(j-i);
best_pos=j;
}
}
for (int j = best_pos; j > i; j--) {
char temp=s[j];
s[j]=s[j-1];
// temp-1得到的是ASCII-1,再强转以后就是对应字符。如果是temp-'1',那么就是对应字符相减
s[j-1]=temp;
}
s[i]=(char)('0'+best_val);
}
System.out.println(new String(s));
}
}
}



京公网安备 11010502036488号