题目来源:链接: [https://leetcode-cn.com/problems/baseball-game/].
你现在是棒球比赛记录员。
给定一个字符串列表,每个字符串可以是以下四种类型之一:
每一轮的操作都是永久性的,可能会对前一轮和后一轮产生影响。
你需要返回你在所有回合中得分的总和。
示例1:
输入: ["5","2","C","D","+"]
输出: 30
解释:
第1轮:你可以得到5分。总和是:5。
第2轮:你可以得到2分。总和是:7。
操作1:第2轮的数据无效。总和是:5。
第3轮:你可以得到10分(第2轮的数据已被删除)。总数是:15。
第4轮:你可以得到5 + 10 = 15分。总数是:30。
示例2:
输入: ["5","-2","4","C","D","9","+","+"]
输出: 27
解释:
第1轮:你可以得到5分。总和是:5。
第2轮:你可以得到-2分。总数是:3。
第3轮:你可以得到4分。总和是:7。
操作1:第3轮的数据无效。总数是:3。
第4轮:你可以得到-4分(第三轮的数据已被删除)。总和是:-1。
第5轮:你可以得到9分。总数是:8。
第6轮:你可以得到-4 + 9 = 5分。总数是13。
第7轮:你可以得到9 + 5 = 14分。总数是27。
注意:
1. 输入列表的大小将介于1和1000之间。
2. 列表中的每个整数都将介于-30000和30000之间。
基本思想和排名第一的大神是一样的。
利用vector容器。
class Solution {
public:
int calPoints(vector<string>& ops) {
vector<int> res;
int sum = 0;
int count = 0;
for(auto &c : ops)
{
if(c == "+")
{
res.push_back(res[count-1] + res[count-2]);
++count;
}
else if(c == "C")
{
res.pop_back();
--count;
}
else if(c == "D")
{
res.push_back(2*res[count-1]);
++count;
}
else
{
res.push_back(atoi(c.c_str())); //这个地方需要注意,函数见下面 我的收获
++count;
}
}
for(auto &s : res)
{
sum += s;
}
return sum;
}
};
用栈。
方法:
class Solution {
public:
int calPoints(vector<string>& ops) {
stack<int> st;
int n = ops.size();
for(int i=0; i<n; i++){
if(ops[i] == "+"){
int a = st.top();
st.pop();
int b = st.top();
st.push(a);
st.push(a+b);
}else if(ops[i] == "D"){
int a = st.top();
st.push(2*a);
}else if(ops[i] == "C"){
st.pop();
}else{
int a = atoi(ops[i].c_str());
st.push(a);
}
}
int sum = 0;
while(!st.empty()){
sum += st.top();
st.pop();
}
return sum;
}
};
语法:
const char *c_str();
c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同.
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针
比如:最好不要这样:
char* c;
string s="1234";
c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理,同时,编译器也将报错——将一个const char *赋与一个char *。
2019/3/26 胡云层 于南京 36