編程練習-字符串展開
阿新 • • 發佈:2019-04-11
adg rip 倒序輸出 疑問 des ann ati 括號 as2
題目來源:華為實習筆試題
給定一個字符串,其中含有括號(大括號,中括號,小括號),括號可以嵌套,且保證括號是配對的,括號前面會有一個數字,要求對字符串進行展開,不帶括號,且括號中的內容需要連續出現括號前面數字規定的次數,並且倒序輸出;示例
abc3{A}
,輸出結果:AAAcba
分析
(當時內心活動[廢話])這是三道題中的第二題,當我看到倒序輸出時,毫無疑問這需要用到棧,回想起了之前本科學到的中綴表達式求值。好吧看似一切很順利,突然發現,括號嵌套,mb,我居然在這個地方陷進去了,所以做了第三題,示例通過率只有45%,再回來做這一題,一直想著兩個棧外加一個隊列去實現,好吧,惡性循環。最後居然沒做出來,更可恨的是,提交了之後,猛然發現自己好蠢啊!
其實兩個棧就可以了,一個用作最後的結果棧tack_res
,一個用作臨時棧stack_temp
,用來進行括號中間串的臨時存儲。
具體步驟:
- 循環遍歷原始串,如果當前字符
不是
右括號}、]、)
,將其push到結果棧stack_res中,否則轉2
; - 將結果棧中的字符依次pop,判斷是否是左括號
{、[、(
,如果是則轉3
,否者將字符push到臨時棧stack_temp中。 - 取結果棧stack_res棧頂元素,這個字符一定是括號前面的數字字符n,表示需要將臨時棧stack_temp中的內容重復
n
次。 - 將臨時棧中的字符拼湊成字符,並借助StringBuilder拼湊
n
次。 將拼湊出的字符串依次將字符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()遇到空格會結束啊,笨蛋;
- 提前做好準備工作啊,建好工程,做好準備,像什麽數組打印之類的。
- 實在做不出來,要學會
騙
分,通過多少測試用例應該是有分的吧!
最後
此致,敬禮!
編程練習-字符串展開