394 Decode String

2013 단어
이 문제는 내가 아래의 코드를 참고했다https://leetcode.com/problems/decode-string/discuss/87534/Simple-Java-Solution-using-Stack그의 이 코드는 아주 예쁘게 쓴 것 같다.필요한 지식은 주로 Stack입니다.Stack 이것은 익혀야 한다. 이것도 매우 고전적인 응용이다.계산기 같애. 그 스틱.여기도 Stack 두 개를 만들었는데 하나는 저장하기 전의 결과이고 하나는 Repeat의 숫자입니다.숫자를 만나면 숫자를 창고에 넣는다.[이전의res를 다른 창고에 눌러놓고 현재res를 공백으로 초기화합니다. 만나기]를 만나면 이전의 숫자 팝을 내보냅니다. 이전의res도 팝을 하고 현재의res를 배수로 곱해서 이전의res의 뒤에 받습니다.이 창고의 수법은 반드시 잘 알아야 한다.이 문제는 몇 번을 반복해서 써야 한다.그리고 제가 한 글자가 숫자인지 아닌지를 판단하기 전에char<='9'& &char>='0'을 계속 사용했습니다. 이것은 너무 어리석습니다. 아래와같은Character를 사용하는 것을 배워야 합니다.isDigit(char) Character.isLetter(char) Character.isLowerCase(char) Character.isUpperCase(char)
또 하나 배울 만한 것은 그가 숫자에 대한 처리를 보는 것이다. 이전에 나는 줄곧 모든 숫자를 다 찾은 다음에 Integer를 사용했다.parseInt. 그의 이 방법은 한 수 위라고 느낀다.나도 다른 곳에서 본 적이 있지만, 줄곧 써 본 적이 없다.
    public String decodeString(String s) {
        Deque resDeque = new LinkedList<>();
        Deque numDeque = new ArrayDeque<>();
        int pt = 0;
        String res = "";
        while (pt < s.length()) {
            char ch = s.charAt(pt);
            if (Character.isDigit(ch)) {
                int num = ch - '0';
                while (pt + 1 < s.length() && Character.isDigit(s.charAt(pt + 1))) {
                    pt++;
                    num *= 10;
                    num += s.charAt(pt) - '0';
                }
                numDeque.push(num);
            } else if (ch == '[') {
                resDeque.push(res);
                res = "";
            } else if (ch == ']') {
                StringBuilder sb = new StringBuilder(resDeque.pop());
                int repeat = numDeque.pop();
                for (int i = 0; i < repeat; i++) sb.append(res);
                res = sb.toString();
            } else {
                res += s.charAt(pt);
            }
            
            pt++;
        }
        return res;
    }

좋은 웹페이지 즐겨찾기