LeetCode Design Compressed String Iterator

Posted Dylan_Java_NYC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Design Compressed String Iterator相关的知识,希望对你有一定的参考价值。

原题链接在这里:https://leetcode.com/problems/design-compressed-string-iterator/description/

题目:

Design and implement a data structure for a compressed string iterator. It should support the following operations: next and hasNext.

The given compressed string will be in the form of each letter followed by a positive integer representing the number of this letter existing in the original uncompressed string.

next() - if the original string still has uncompressed characters, return the next letter; Otherwise return a white space.
hasNext() - Judge whether there is any letter needs to be uncompressed.

Note:
Please remember to RESET your class variables declared in StringIterator, as static/class variables are persisted across multiple test cases. Please see here for more details.

Example:

StringIterator iterator = new StringIterator("L1e2t1C1o1d1e1");

iterator.next(); // return ‘L‘
iterator.next(); // return ‘e‘
iterator.next(); // return ‘e‘
iterator.next(); // return ‘t‘
iterator.next(); // return ‘C‘
iterator.next(); // return ‘o‘
iterator.next(); // return ‘d‘
iterator.hasNext(); // return true
iterator.next(); // return ‘e‘
iterator.hasNext(); // return false
iterator.next(); // return ‘ ‘

题解:

用 i 标记当前index位置. 用count计数之前char出现的次数. 当count--到0时继续向后移动 i.

Time Complexity: hasNext(), O(1). next(), O(n). n为数字串的长度.

Space: O(1).

AC Java:

 1 class StringIterator {
 2     String s;
 3     int i = 0;
 4     int count = 0;
 5     
 6     char res;
 7     public StringIterator(String compressedString) {
 8         this.s = compressedString;    
 9     }
10     
11     public char next() {
12         if(!hasNext()){
13             return ‘ ‘;
14         }
15 
16         if(count == 0){
17             res = s.charAt(i);
18             i++;
19             while(i<s.length() && Character.isDigit(s.charAt(i))){
20                 //Overflow
21                 if(count > Integer.MAX_VALUE/10 || (count == Integer.MAX_VALUE/10 && s.charAt(i)>=‘8‘)){
22                     throw new IllegalArgumentException("Repeated number is larger than Integer.MAX_VALUE.");
23                 }
24                 
25                 count = count*10 + (s.charAt(i)-‘0‘);
26                 i++;
27             }
28         }
29         count--;
30         return res;
31     }
32     
33     public boolean hasNext() {
34         return !(i==s.length() && count==0);
35     }
36 }
37 
38 /**
39  * Your StringIterator object will be instantiated and called as such:
40  * StringIterator obj = new StringIterator(compressedString);
41  * char param_1 = obj.next();
42  * boolean param_2 = obj.hasNext();
43  */

 



以上是关于LeetCode Design Compressed String Iterator的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode Design Hit Counter

LeetCode 622. Design Circular Queue

LeetCode设计题 design(共38题)

LeetCode 641. Design Circular Deque

LeetCode Design Compressed String Iterator

LeetCode Design Log Storage System