Contents

ARST打卡第179周[179/521]

Algorithm

lc856_括号的分数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/* 
[wolfdan@cloud cpp]$ g++ A.cpp -o A.o -g
[wolfdan@cloud cpp]$ gdb A.o

这里的思路是最朴素的模拟栈,题解2中有优化操作,但是较难想到,所以可以参考借鉴,其他2中方法也可以借鉴一下
https://leetcode.cn/problems/score-of-parentheses/solution/gua-hao-de-fen-shu-by-leetcode-solution-we6b/
*/
#include <bits/stdc++.h>
using namespace std;

class Solution {
   public:
    // 感觉是一个栈模拟的题目,然后需要用特殊字符#代表一下中间态的分数
    // 这里相信input为合法值,参数校验在外层做
    int scoreOfParentheses(string s) {
        vector<int> tmp_sum;
        int ans = 0;
        stack<char> chs;
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == '(') {
                chs.push(s[i]);
            } else {
                if (chs.top() == '(') {
                    chs.pop();
                    tmp_sum.push_back(1);
                    // 在插入#前检测前面是否为#,最多连续一个#,因为之前有#都会被下面逻辑先吃点
                    // 但是用while没有关系
                    while (!chs.empty() && chs.top() == '#') {
                        int len = tmp_sum.size();
                        tmp_sum[len - 2] += tmp_sum[len - 1];
                        chs.pop();
                        tmp_sum.pop_back();
                    }
                    chs.push('#');
                } else if (chs.top() == '#') {
                    chs.pop();
                    // assert(chs.top() == '(');
                    chs.pop();
                    int len = tmp_sum.size();
                    tmp_sum[len - 1] *= 2;
                    while (!chs.empty() && chs.top() == '#') {
                        int len = tmp_sum.size();
                        tmp_sum[len - 2] += tmp_sum[len - 1];
                        chs.pop();
                        tmp_sum.pop_back();
                    }
                    chs.push('#');
                }
            }
        }
        return tmp_sum[0];
    }
};

int main() {
    Solution sol;
    printf("Ans: %d \n", sol.scoreOfParentheses(string("()")));
    cout << sol.scoreOfParentheses("(())") << endl;
    cout << sol.scoreOfParentheses("(())") << endl;
    cout << sol.scoreOfParentheses("(()(()))") << endl;

    return 0;
}

Review-不该作弊的真正原因以及为啥不该互相出卖和拖累

不要作弊,损害同学的排名不是主要关键问题,关键问题是:

  1. 会让周围变成竞争,而不是互帮互助
  2. 会让你形成一个作弊的坏习惯,会让你以后无法做出一些好的成就,无法做出出色的工作,因为那里没法作弊

背叛和卖队友求荣只会让世界变成恶性竞争的坏地方(以前的汉奸),只有相互帮助才能创造一个更好的世界(入狱但团结一致的队友们)

–上面的review材料来自耗子叔的一条推文

Tips

solidity入门教程 https://wtf.academy/solidity-start/

Share

g++编译带-g,可以在gdb的时候能找到源文件

1
2
g++ A.cpp -o A.o -g
gdb A.o