题目
小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
你能帮帮小Q吗?
输入描述
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述
对于每组数据,输出移位后的字符串。
输入例子
AkleBiCeilD
输出例子
kleieilABCD
思路
从str的尾端开始,找到第一个大写字母,如果右边有小写字母,则冒泡到尾端大写字母为止
代码
package com.whu.fly.nowcoder;
import java.util.*;
/**算法基础-字符移位
* 1.从str的尾端开始,找到第一个大写字母,冒泡到尾端大写字母为止,
* 2.输出str
*/
public class MoveCharacter {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String str = scanner.next();
int size = str.length();
for (int i = size - 1; i >= 0; i--) {
if (isUp(str.charAt(i))) {
for (int j = i; j < size - 1; j++) {
if (isUp(str.charAt(j + 1)))
break;
if (isLow(str.charAt(j + 1))) {
str = swapStr(str, j, j + 1);
}
}
}
}
System.out.println(str);
}
}
private static boolean isUp(char a){
return a >= 'A' && a <= 'Z';
}
private static boolean isLow(char a){
return a >= 'a' && a <= 'z';
}
private static String swapStr(String s, int a, int b){
String strA = s.substring(a, a + 1);
String strB = s.substring(b, b + 1);
StringBuilder builder = new StringBuilder(s);
builder.replace(a, a + 1, strB);
builder.replace(b, b + 1, strA);
return builder.toString();
}
}
讨论区有感
- 判断大小写有现成的方法,Character.isLowerCase()&Character.isUpperCase();
- 巧妙的解题思路:将String存到StringBuilder中,从首端开始,找到第一个大写字母,在StringBuilder中append那个大写字母,然后再delete那个大写字母。
StringBuffer sb = new StringBuffer(sc.nextLine());
int times = 0;
for(int i = 0; i < sb.length() - times; i++) {
if(Character.isLowerCase(sb.charAt(i)))
continue;
sb.append(sb.charAt(i));
sb.delete(i, i + 1);
times++;
i--;
}