1. vector的字符串中,size()和length()是一样的。length()只是用来获取字符串的长度。
length()、size()、sizeof()三者的区别_vector用size还是length_我是一只蘑菇17的博客-CSDN博客
2. swicth-case里,定义新的变量的方法:
在case后加上作用域符号{}即可解决。
- #include
- class Solution {
- public:
- /**
- * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
- *
- * 返回表达式的值
- * @param s string字符串 待计算的表达式
- * @return int整型
- */
- // 返回vector
而不是int - vector<int> fun(string s, int start) {
- char temp_op = '+';
- int temp_num = 0;
- stack<int> res; //存储最后的、用来求和的结果
-
- int i = start;
- for (; i < s.size(); i++) {
- //1.预处理操作(处理数字、处理带括号的递归)
- //如果当前s[i]是数字
- if (isdigit(s[i])) {
- temp_num = temp_num * 10 + s[i] - '0';
- if (i != s.size() - 1)
- //如果后面还有东西,continue,不能进行下面的操作
- //如果没有这个if-continue语句,那么temp_num会在后面被“归零”
- continue; //粗心,写成break了
- }
- //如果当前s[i]是'('
- if (s[i] == '(') {
- vector<int> kuohao = fun(s, i + 1);
- // 不需要push,因为'('前已经push了,此时temp_num是归零状态
- // res.push(kuohao[0]);
- temp_num = kuohao[0]; //粗心忘了
- i = kuohao[1];
- if (i != s.size() - 1)
- continue;
- }
-
- //2.处理当前的操作(把数字放入最终的列表)
- //如果当前s[i]是其他操作符,根据temp_op,把temp_num放入res
- switch (temp_op) {
- case '+':
- res.push(temp_num);
- break;
- case '-':
- res.push(-temp_num);
- break;
- case '*':
- temp_num *= res.top();
- res.pop();
- res.push(temp_num);
- break;
- }
-
- // 3. 归零系列操作
- // 相当于全局变量,所以在push了temp_num后,下一次for循环前,要“归零”
- temp_num = 0;
-
- if (s[i] == ')')
- break; // break需要中断整个for循环,直接结束,所以放在switch外面。
- else
- temp_op = s[i];
- }
-
- // 最后,求和
- int res_total = 0;
- int res_size = res.size();
- // 注意,不能for循环里面用size,因为res在每个循环后的size是变化的。for (int j = 0; j < res.size(); j++) {
- for (int j = 0; j < res_size; j++) {
- res_total += res.top();
- res.pop();
- }
- return vector<int> {res_total, i};
- }
- int solve(string s) {
- // write code here
- return fun(s, 0)[0];
- }
- };