给定一个字符串列表,每个字符串可以是以下4种类型之一,•整数(一轮的分数):直接表示你在这一轮得到的分数。
•“十”(一轮的分数)::表示你在这轮得到的分数是最后两轮有效分数的总和。
•“D”(一轮的分数):表示你在这一轮得到的分数是上一轮有效分数的翻倍数据。
•“c”(个操作,不是一轮的分数):表示上一轮有效的分数是无效的,应该
被删除。
输入是 52CD+这五个字符这样子吗?还是你例子中还有一堆双引号和括号啥的?
搞个数组,记录每轮的分数,并记录有效轮数。如果为C,则轮数减去1。最后把所有有效轮数的分数相加就行了
#include<iostream>
using namespace std;
int main()
{
char a[1001] = {0};
int s[1000] = {0},n=0,i=0,sum=0;
gets_s(a);
while(a[i] != '\0')
{
switch(a[i])
{
case 'C':
{
if(n>0)
n--;
}
break;
case 'D':
{
if(n>0)
{
s[n] = s[n-1] * 2;
n++;
}
}
break;
case '+':
{
if(n>1)
{
s[n] = s[n-1]+s[n-2];
n++;
}
else if(n==1)
{
s[1] = s[0];
n=2;
}
}
break;
default:
{
s[n] = a[i]-'0';
n++;
}
break;
}
i++;
}
for(i=0;i<n;i++)
sum += s[i];
cout<<sum<<endl;
return 0;
}
class Solution {
public:
int calPoints(vector<string>& ops) {
stack<int> numStack;
int opsSize = ops.size();
for (int i = 0; i < opsSize; ++i)
{
string s = ops[i];
if (s == "C")
numStack.pop();
else if (s == "D")
numStack.push(2 * numStack.top());
else if (s == "+")
{
int pre1 = numStack.top();
numStack.pop();
int pre2 = numStack.top();
numStack.push(pre1);
numStack.push(pre1 + pre2);
}
else
numStack.push(atoi(s.c_str()));
}
int ret = 0;
while (!numStack.empty())
{
ret += numStack.top();
numStack.pop();
}
return ret;
}
};
用一个栈实现