算法每一题,成长每一天~
C0E20 字符串变换最小字符串
真题链接:【持续更新】2024华为 OD 机试E卷 机考真题库清单(全真题库)
思路
1、先排序。
2、然后逐个字符对比,找到第一个不同的,就是需要交换的。
Java
import java.util.Arrays;
import java.util.Scanner;
public class C0E20 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String line = in.nextLine();
char[] arr = line.toCharArray();
Arrays.sort(arr);
Character left = null, right = null;
int leftIdx = -1;
for (int i = 0; i < line.length(); i++) {
if (line.charAt(i) != arr[i]) { // 找到第一位不同的字符
leftIdx = i;
left = line.charAt(i);
right = arr[i];
break;
}
}
if (leftIdx == -1) {
// 表示字符串已经是排好序的
System.out.println(line);
return;
}
// 现在要把 left 换到右边去,right换到左边来
// 找到最右边的(如果有相同的字符)!!!
int rightIdx = line.lastIndexOf(String.valueOf(right));
char[] arr2 = line.toCharArray();
arr2[leftIdx] = right;
arr2[rightIdx] = left;
System.out.println(new String(arr2));
}
}
总结
1、前面考虑漏了一点,就是有相同字符的情况。
如果要替换到前面的字符有多个,说明这个字符更小,那就需要把排在最后面的这个字符替换到前面来,使用 lastIndexOf()
,而不是第一个。比如:bcdaa,替换后应该是 acdab,而不是 acdba。
2、越是容易的题,越要细心!
算法要多练多练多练!!