资料:
1. vector的字符串中,size()和length()是一样的。length()只是用来获取字符串的长度。
length()、size()、sizeof()三者的区别_vector用size还是length_我是一只蘑菇17的博客-CSDN博客
2. swicth-case里,定义新的变量的方法:
在case后加上作用域符号{}即可解决。
模板的:
- 遍历一遍,变成所有数求和。最后求和。
- +号后面的数,直接放
- -号后面的数,取相反数放
- *号则将当前数和最后放进去的数相乘,再放
- 遇到(),递归。
-
#include <cctype> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ // 返回vector<int> 而不是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]; } };