まず、従来の小さな問題
スタックは、我々は補助スタックを必要とするので、ああ達成するために、確かに不可能です。
クラスMYQUEUE { スタック <整数> stack1、stack2。 / ** ここにあなたのデータ構造を初期化します。* / パブリックMYQUEUE(){ stack1 = 新しいスタック<整数> (); stack2 = 新しいスタック<整数> (); } / ** キューの後ろにプッシュ要素x。* / 公共 ボイドプッシュ(INT X){ stack1.push(X)。 } / ** キュー要素戻りの前から要素を削除します。* / 公共 のintポップ(){ F(stack1、stack2)。 リターンstack2.pop(); } / ** フロント要素を取得します。* / パブリック int型PEEK(){ F(stack1、stack2)。 リターンstack2.peek(); } / ** キューが空であるかどうかを返します。* / パブリック ブール空(){ 戻り stack2.empty()&& stack1.empty()。 } プライベート 無効 F(スタック<整数> S1、スタック<整数> S2){ 場合(s2.empty()){ しばらく(! s1.empty()){ 整数の一時 = s1.pop()。 s2.push(TEMP)。 } } } }
チームは複数の要素が、それぞれが来たとき、私たちは、吸気で再び尾からのn-1の要素の前に置きます
クラスMyStack { プライベートキュー<整数> キュー。 パブリックMyStack(){ キュー = 新しい LinkedListの<> (); } 公共 ボイドプッシュ(INT X){ queue.add(X)。 INT CNT = queue.size()。 一方、(cnt--> 1 ){ queue.add(queue.poll())。 } } 公共 int型のポップ(){ 戻りqueue.remove()。 } 公共 INT トップ(){ リターンqueue.peek(); } パブリック ブール空(){ リターンqueue.isEmpty()。 } }
現在のスタック最小要素の補助スタックトレースを使用して、常に分に注意を払う必要があり、正しいことを確認するために、スタックの補助スタックトップの要素に等しいです。
クラスMinStack { プライベート int型分= Integer.MAX_VALUEで、 LinkedListは <整数> dataStack。 LinkedListは <整数> minStack。 / ** ここにあなたのデータ構造を初期化します。* / パブリックMinStack(){ dataStack = 新しい LinkedListの<> (); minStackは = 新しい LinkedListのを<> (); } 公共 ボイドプッシュ(INT X){ dataStack.add(X)。 分 = Math.min(分、x)は、 minStack.add(分)。 } 公共 ボイドポップ(){ dataStack.pollLast()。 minStack.pollLast(); 分 = minStack.isEmpty()?Integer.MAX_VALUEの:minStack.peekLast(); } パブリック int型の上部(){ リターンdataStack.peekLast()。 } パブリック INT getMin(){ 戻り)(minStack.peekLastします。 } }
第二に、マッチングブラケットの問題
クラスのソリューション{ パブリック ブールのisValid(Stringを){ 場合(sが== "")を返す 真。 もし(S == NULL || s.length()%2 == 1)戻り 偽。 LinkedListは <文字>スタック= 新しい LinkedListは<> (); 以下のために(INT ; I <s.length(); iが0 = I ++ ){ 場合(!stack.isEmpty()|| F(stack.peekLast()、s.charAt(I))){ stack.add(S .charAt(I))。 続け; } 場合(F(stack.peekLast()、s.charAt(I))){ stack.pollLast()。 } } を返す)(stack.isEmptyします。 } プライベート ブール F(チャー C1、チャーC2){ もし、(C1 == '(' && C2 == '') ) を返す 真。 それ以外の 場合(C1 == '[' && C2 == ']' ) を返す 真。 そう であれば(C1 == '{' && C2 == '}' ) を返す 真。 } }
問題の難易度は、私たちが答え文字列を生成するために、スタックをプッシュする方法です。
ポインタの文字、右括弧に直面したとき、左ブラケットは、それぞれ、スタックの文字と数字が発生した追加のデジタル受信機とポインタを受け取る、先入れ先出しスタック番号は、引き紐連結内倍増。
クラスソリューション{ パブリック文字列decodeString(文字列S){ もし、(S == NULL)戻り ヌル。 もし(s.length()== 0)リターン "" ; LinkedListの <StringBuilderの> Q = 新しい LinkedListの<> (); LinkedListの <整数>データ= 新しい LinkedListの<> (); StringBuilderのANS = 新しいStringBuilderの(); StringBuilderのNUM = 新しいStringBuilderの(); 用(CHARC:s.toCharArray()){ 場合(C> = '0' && C <= '9' )num.append(C); 他の 場合(C> = '' && C <= 'Z' )ans.append(C); 他の 場合(C> = 'A' && C <= 'Z' )ans.append(C); そう であれば(C == '[' ){ data.add(Integer.valueOf(新しい文字列(NUM)))。 NUM = 新しいStringBuilderの(); q.add(ANS)。 ANS = 新しいStringBuilderの(); INT、N = data.pollLast()。 StringBuilder TEMP = 新しいStringBuilderの(ANS)。 一方、( - N> 0 ){ ans.append(TEMP)。 } ANS = q.pollLast()アペンド(ANS)。 } } 戻り 、新たな文字列(ANS)を、 } }
第三に、周りを探しよりも、この大小の要素数の最初の
leetcod雨水