一、题目
给定一个字符串s,最多只能进行一次变换,返回变换后能得到的最小字符串(按照字典序进行比较)。
变换规则:交换字符串中任意两个不同位置的字符。
二、思路与代码过程
1.思路
(1)遍历解法,算出当前索引值,然后进行只交换一次的重新排序,再次计算索引值,得到最小的返回。
(2)算法:特殊点在于min,max与头尾的位置关系。
选择第二种(方便一些)
2.代码过程
①main函数
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String s = sc.nextLine();
System.out.println("输入的字符串为:");
System.out.println(s);
countIndex(s);
String ts = transferS(new StringBuilder(s)).toString();
countIndex(ts);
System.out.println("转换后的字符串为:" +ts);
}
②关于字典序
(可有可无,方便判断而已)
private static void countIndex(String s) {
List<Integer> Index = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
int index = getIndex(s.charAt(i));
Index.add(index);
}
System.out.println("当前字符串字典序为:"+Index);
}
private static int getIndex(char c) {
// 处理小写字母
if ('a' <= c && c <= 'z') {
return c - 'a' + 1;
}
// 处理大写字母
else if ('A' <= c && c <= 'Z') {
return c - 'A' + 1;
}
// 非字母字符
else {
throw new IllegalArgumentException("输入的字符不是字母: " + c);
}
}
③transfer函数
private static String transferS(StringBuilder s) {
// 使用 StringBuilder 创建可变字符序列
StringBuilder sb = new StringBuilder(s);
System.out.println("sb为:"+sb);
char min = s.charAt(0);
char max = s.charAt(s.length()-1);
int posmax =0;
int posmin = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) <= min) {
min = s.charAt(i);
posmin = i;
}
if (s.charAt(i) >= max) {
max = s.charAt(i);
posmax = i;
}
}
System.out.printf("最小的为%c,位置为%d\n",min,posmin);
System.out.printf("最大的为%c,位置为%d\n",max,posmax);
//换位判断
//若min不为头,min换到头部
if (posmin!=0){
System.out.println("min不是头");//
char char1 = sb.charAt(posmin);
char char2 = sb.charAt(0);
sb.setCharAt(posmin, char2);
sb.setCharAt(0, char1);
} else if (posmax!=s.length()-1) {//min为头但max不为尾,max到尾部
System.out.println("min是头,max不是尾部");//
char char1 = sb.charAt(posmax);
char char2 = sb.charAt(s.length()-1);
sb.setCharAt(posmax, char2);
sb.setCharAt(s.length()-1, char1);
}else if (posmin==0&&posmax==s.length()-1){
System.out.println("min是头,max也是尾");//
StringBuilder substring = new StringBuilder(sb.substring(posmin+1,posmax));
transferS(substring);
sb.replace(posmin+1,posmax,transferS(substring));
}
System.out.println(sb);
return sb.toString();
}