题目看上去很简单
但是刚开始想了挺久没动键盘…
最初的想法,要记录索引,又要记录索引上的值,所以想到了Map集合,但是Map集合没有索引,也没有办法根据索引排序,也不好给值倒序
后来想到一个办法:
public static String change(String number) {
char[] chars = number.toCharArray();
int[] flag = new int[chars.length];
loop:for (int i = 0; i < chars.length; i++) {
if(chars[i]%2==0){
for (int j = chars.length - 1; j >= 0; j--) {
if(chars[j]%2==0){
if(flag[i]==0&&flag[j]==0){
char temp =chars[i];
chars[i]=chars[j];
chars[j]=temp;
flag[i]=1;
flag[j]=1;
}else
break loop;
}
}
}
}
return new String(chars);
}
大概的思路是:嵌套for循环一个正向找偶数,一个逆向找偶数,难以避免的偶数被重复找到,所以定义一个flag数组,flag的索引和chars的索引一一对应,如果chars索引对应的值已经被调换过位置,那么flag对应的索引数值改为1。
但是后来一想到正向找数和逆向找数,想到了快排的底层实现
链接: 这个链接点进去看-5.3快速排序.
想到了另一种思路
public static String change(String number) {
//字符串转char数组
char[] numbers = number.toCharArray();
//定义左右指针
int left=0;
int right=number.length()-1;
//都找到偶数则交换
while (left<right){
//从左边找到第一个偶数
while(left<right&&numbers[left]%2!=0)
left++;
//从右边找到第一个偶数
while(left<right&&numbers[right]%2!=0)
right--;
//交换
char temp=numbers[left];
numbers[left]=numbers[right];
numbers[right]=temp;
//更新指针
left++;
right--;
}
return String.valueOf(numbers);
}
一点拙见,欢迎指正。