面試筆試題--字符移位

題目

小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();
    }
}

討論區有感

  1. 判斷大小寫有現成的方法,Character.isLowerCase()&Character.isUpperCase();
  2. 巧妙的解題思路:將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--; 

              } 

發佈了63 篇原創文章 · 獲贊 78 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章