技術共有

7 月 11 日の学習チェックイン、データ構造スタック

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

みなさんこんにちは、このブログの目的は夏休み中の勉強チェックを記録することです 後々コラムにまとめる予定ですので、主な目的は夏休み中にデータ構造の勉強を終わらせることです。データ構造の実装に関するいくつかの関連ブログと、個人的な学習と使用のためのクイズも投稿します。欠点がある場合はご指摘ください。

1. 最小スタックのリコウ 115

. - リートコード

配列を使用してスタックをシミュレートするだけですが、ここでは手間を省こうとしているため、実行速度はそれほど高くなく、最適化の余地がたくさんあります。

  1. class MinStack {
  2. int[] el;
  3. int numsize;
  4. public MinStack() {
  5. el = new int[10000];
  6. int numsize = 0;
  7. }
  8. // private void grow(){
  9. // this.el=Arrays.copyof(el,2*el.lenth);
  10. // }
  11. public void push(int val) {
  12. // if (el.lenth == numsize) {
  13. // grow();
  14. // }
  15. el[numsize] = val;
  16. numsize++;
  17. }
  18. public int pop() {
  19. if (empty())
  20. return -1;
  21. return el[--numsize];
  22. }
  23. public int top() {
  24. return el[numsize - 1];
  25. }
  26. private boolean empty() {
  27. return numsize == 0;
  28. }
  29. public int getMin() {
  30. int num = el[0];
  31. for (int i = 0; i < numsize; i++) {
  32. if (el[i] < num)
  33. num = el[i];
  34. }
  35. return num;
  36. }
  37. }
  38. /**
  39. * Your MinStack object will be instantiated and called as such:
  40. * MinStack obj = new MinStack();
  41. * obj.push(val);
  42. * obj.pop();
  43. * int param_3 = obj.top();
  44. * int param_4 = obj.getMin();
  45. */

2. ヤン・フイ・トライアングル

. - リートコード

分析: 先ほど学習したシーケンス テーブルを使用してこの問題を解決します。シーケンス テーブルを使用して 2 次元配列をシミュレートすることに注意してください。シーケンス テーブルによってシミュレートされた 2 次元配列は、添え字を介して要素に単純にアクセスすることはできません。

  1. class Solution {
  2. public List<List<Integer>> generate(int numRows) {
  3. List<List<Integer>> ret=new ArrayList<>();
  4. List<Integer> list=new ArrayList<>();
  5. list.add(1);
  6. ret.add(list);
  7. for(int i=1;i<numRows;i++){
  8. List<Integer> row=new ArrayList<>();
  9. row.add(1);
  10. List<Integer> a= ret.get(i-1);
  11. for (int j = 1; j < i; j++) {
  12. int val1=a.get(j);
  13. int val2=a.get(j-1);
  14. row.add(val1+val2);
  15. }
  16. row.add(1);
  17. ret.add(row);
  18. }
  19. return ret;
  20. }
  21. }

3、150 を押し、逆ポーランド語式を評価します

注:ポーランド語表現はコンピュータが理解できる表現です

. - リートコード

アイデア: 配列を走査し、まず文字列が数値かどうかを判断し、数値の場合は、数値に変換されてスタックにプッシュされます。そうでない場合は、2 つのオペランドが取り出され、「+」、「-」、「*」または「/」の後のオペランドが取り出されます。演算子が使用されます。、スタックに残っているものが最終的な答えです

  1. class Solution {
  2. public int evalRPN(String[] tokens) {
  3. Stack<Integer> st = new Stack();
  4. for (int i = 0; i < tokens.length; i++) {
  5. String str = tokens[i];
  6. if (o(str) == false) {
  7. int val = Integer.parseInt(str);
  8. st.push(val);
  9. } else {
  10. int val1 = st.pop();
  11. int val2 = st.pop();
  12. switch (str) {
  13. case "+":
  14. st.push(val2+val1);
  15. break;
  16. case "-":
  17. st.push(val2-val1);
  18. break;
  19. case "*":
  20. st.push(val2*val1);
  21. break;
  22. case "/":
  23. st.push(val2/val1);
  24. break;
  25. }
  26. }
  27. }
  28. return st.peek();
  29. }
  30. private boolean o (String s){
  31. if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {
  32. return true;
  33. }
  34. return false;
  35. }
  36. }

今回のブログはここまでです、皆さんありがとうございました