可以用双指针的方法来实现:
① 定义两个指针 i 和 j ,初始化为字符串的首尾位置;
② 当 i < j 时,依次对比字符串 i 和 j 位置的字符
- 若 i 位置是小写字母,i 指针加 1;
- 若 j 位置是大写字母,j 指针减 1;
- 若 i 位置是大写字母,j 位置是小写字母,则交换两个位置的字符,并将 i 和 j 指针分别加 1 和 减 1 ;
- 否则,i 和 j 分别加 1 和 减 1
③ 当 i >= j 时,完成字符串的处理。
代码实现如下:
public static String moveUpperCase(String str) {
if(str == null || str.length() <= 1){
return str;
}
char[] chars = str.toCharArray();
int i = 0, j = str.length() - 1;
while (i < j) {
if (Character.isLowerCase(chars[i])) {
i++;
} else if (Character.isUpperCase(chars[j])) {
j--;
} else if (Character.isUpperCase(chars[i]) && Character.isLowerCase(chars[j])) {
char temp = chars[i];
chars[i++] = chars[j];
chars[j--] = temp;
} else {
i++;
j--;
}
}
return new String(chars);
}
在这个方法中,首先判断输入字符串是否为空或者长度为 1,如果满足这些条件则直接返回原始字符串,否则进入双指针处理的 while 循环,直到 i >= j 时退出循环。其中,Character.isLowerCase() 和 Character.isUpperCase() 方法分别用于判断字符是否为小写字母和大写字母。
在上述代码中,str.toCharArray()
方法将输入的字符串 str
按照字符分割成了一个字符数组 char[]
,之后我们对字符数组进行操作实现字符串的处理,最后再将字符数组转换为字符串返回。需要注意的是,在这个过程中,输入的原始字符串并没有变化。