題目
小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--;
}