题目
题目描述:
给定一个字符串s,最多只能进行一次变换,返回变换后能得到的最小字符串(按照字典序进行比较)。变换规则:交换字符串中任意两个不同位置的字符。
输入描述:---串小写字母组成的字符串s
输出描述:按照要求进行变换得到的最小字符串
备注:s是都是小写字符组成
1<=s.length<=1000
示例1
输入:abcdef
输出:abcdef
说明:abcdef已经是最小字符串,不需要交换
示例2
输入∶bcdefa
输出:acdefb
说明:a和b进行位置交换,可以得到最小字符串
思路
将字符串中的字符按字典序排序(需要携带索引信息,所以list中可以考虑存放int[]的形式),得到list
遍历str,字符串逐位和list对比,如果第i位不一样,那么此时需要交换的位置就是,i和list.get(i)中存放的索引位置。
输出交换位置后的字符串即可
题解
java
package hwod;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class TheMinStr {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(theMinStr(str));
}
private static String theMinStr(String str) {
List<int[]> list = new ArrayList<>();
for (int i = 0; i < str.length(); i++) {
list.add(new int[]{str.charAt(i), i});
}
list.sort((o1, o2) -> {
if(o1[0]!=o2[0]) return o1[0] - o2[0];
return o1[1] - o2[1];
});
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) != list.get(i)[0]) {
return swap(str, i, list.get(i)[1]);
}
}
return str;
}
private static String swap(String str, int i, int j) {
char[] chars = str.toCharArray();
char t = chars[i];
chars[i] = chars[j];
chars[j] = t;
return String.valueOf(chars);
}
}
推荐
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。