1. 程式人生 > >編程練習-字符串展開

編程練習-字符串展開

adg rip 倒序輸出 疑問 des ann ati 括號 as2

題目來源:華為實習筆試題

給定一個字符串,其中含有括號(大括號,中括號,小括號),括號可以嵌套,且保證括號是配對的,括號前面會有一個數字,要求對字符串進行展開,不帶括號,且括號中的內容需要連續出現括號前面數字規定的次數,並且倒序輸出;示例abc3{A},輸出結果: AAAcba

分析

(當時內心活動[廢話])這是三道題中的第二題,當我看到倒序輸出時,毫無疑問這需要用到棧,回想起了之前本科學到的中綴表達式求值。好吧看似一切很順利,突然發現,括號嵌套,mb,我居然在這個地方陷進去了,所以做了第三題,示例通過率只有45%,再回來做這一題,一直想著兩個棧外加一個隊列去實現,好吧,惡性循環。最後居然沒做出來,更可恨的是,提交了之後,猛然發現自己好蠢啊!

其實兩個棧就可以了,一個用作最後的結果棧tack_res,一個用作臨時棧stack_temp,用來進行括號中間串的臨時存儲。
具體步驟:

  1. 循環遍歷原始串,如果當前字符不是右括號}、]、),將其push到結果棧stack_res中,否則轉2
  2. 將結果棧中的字符依次pop,判斷是否是左括號{、[、(,如果是則轉3,否者將字符push到臨時棧stack_temp中。
  3. 取結果棧stack_res棧頂元素,這個字符一定是括號前面的數字字符n,表示需要將臨時棧stack_temp中的內容重復n次。
  4. 將臨時棧中的字符拼湊成字符,並借助StringBuilder拼湊n次。
  5. 將拼湊出的字符串依次將字符push到結果棧stack_res中,回到1


    *流程
    技術分享圖片

    實現(java)

package sx20190410;
import java.util.*;
/**
 * @ClassName: StringExtendWithKuoHao
 * @Author: fanjiajia
 * @Date: 2019/4/10 下午8:29
 * @Version: 1.0
 * @Description:
 */
public class StringExtendWithKuoHao {

    private static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {

        List<Character> list = new LinkedList<Character>(){
            {
                add('{');
                add('[');
                add('(');
                add(')');
                add(']');
                add('}');

            }
        };
        List<Character> list_left = new LinkedList<Character>(){
            {
                add('{');
                add('[');
                add('(');
            }
        };
        List<Character> list_right = new LinkedList<Character>(){
            {
                add(')');
                add(']');
                add('}');

            }
        };
        while (scanner.hasNext()) {

            String str = scanner.next(); // 原始字符串
            Stack<Character> stack_res = new Stack<>();
            Stack<Character> stack_temp = new Stack<>();

            for (int i = 0; i < str.length(); i++) {

                if (!list_right.contains(str.charAt(i))) { // 不是右邊的
                    stack_res.push(str.charAt(i));
                }else {
                    // 是右邊的,消解
                    Character character;
                    while (!list_left.contains((character = stack_res.pop()))) {
                        // 彈出的不是左邊括號也就是字符,加入臨時棧
                        stack_temp.push(character);
                    }
                    // character是左邊括號
                    int n = Integer.valueOf(String.valueOf(stack_res.pop()));
                    String temp = "";
                    StringBuilder sb = new StringBuilder();
                    while (stack_temp.size() > 0) {
                        temp += stack_temp.pop();
                    }
                    for (int j = 0; j < n; j++) {
                        sb.append(temp);
                    }
                    temp = sb.toString();
                    for (int k = 0; k < temp.length(); k++) {
                        stack_res.push(temp.charAt(k));
                    }
                }
            }
            while (stack_res.size() > 0) {
                System.out.print(stack_res.pop());
            }
        }
    }
}

結果

abc3{as2[sd]sd3(we)2{s}4{svf}}
fvsfvsfvsfvsssewewewdsdsdssafvsfvsfvsfvsssewewewdsdsdssafvsfvsfvsfvsssewewewdsdsdssacba

感受(總結)

  • 得多練啊,基礎知識啊,隊列的使用都不會,氣人不氣人!
  • 平時不要只做代碼搬運工啊,int n = Integer.valueOf(‘2‘); 得到的結果不是2,是50啊(這裏是字符2,不是字符串2);
  • scanner.next()遇到空格會結束啊,笨蛋;
  • 提前做好準備工作啊,建好工程,做好準備,像什麽數組打印之類的。
  • 實在做不出來,要學會分,通過多少測試用例應該是有分的吧!

最後

此致,敬禮!

編程練習-字符串展開