初学者,写的比较啰嗦且不简洁,仅供参考,见谅!
今年9月份参加华为od机试,抽到的题,给一任意字符串,仅交换一次字符串中两个字符位置,使字符串字典顺序最小!
如 输入abcfd,输出 abcdf,输入fcgad, 输出acgfd。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
char[] chars = str.toCharArray();
char[] tmp = str.toCharArray();
//将字符串按照字典顺序排序
Arrays.sort(tmp);
//从前往后遍历字符串将第一个非最佳排序字符索引求出
int flag=-1;
for (int i = 0; i < chars.length; i++) {
if (chars[i]-tmp[i]==0){
continue;
}else {
flag=i;
break;
}
}
String result = "";
if (flag!=0&&flag!=-1){
//截取非最佳排序字符串
char[] goal = str.substring(flag).toCharArray();
char[] sign = str.substring(flag).toCharArray();
char fig='z';
//求取出非最佳排序片段中的字典顺序最靠前字符
for (int i = 0; i < goal.length; i++) {
if (goal[i]<fig){
fig=goal[i];
}
}
//求出非最佳排序片段中的字典顺序最小字符的最靠后索引
int max=-1;
for (int i = goal.length-1; i >=0; i--) {
if (goal[i]-fig==0){
max=i;
break;
}
}
//将flag与max位置调换即可
sign[0]=goal[max];
sign[max]=goal[0];
for (char c : sign) {
result+=c;
}
result=str.substring(0,flag)+result;
}else if (flag==-1){
result=str;
}else{
char fig='z';
//求取出非最佳排序片段中的字典顺序最小字符
for (int i = 0; i < chars.length; i++) {
if (chars[i]<fig){
fig=chars[i];
}
}
int max = str.lastIndexOf(fig);
char[] tmp2 = str.toCharArray();
tmp2[0]=chars[max];
tmp2[max]=chars[0];
for (char c : tmp2) {
result+=c;
}
}
System.out.println(result);
}