LeetCode -- 682 棒球比赛

题目:
你现在是棒球比赛记录员。 给定一个字符串列表,每个字符串可以是以下四种类型之一:
1.整数(一轮的得分):直接表示您在本轮中获得的积分数。 2. "+"(一轮的得分):表示本轮获得的得分是前两轮有效 回合得分的总和。 3. "D"(一轮的得分):表示本轮获得的得分是前一轮有效 回合得分的两倍。 4. "C"(一个操作,这不是一个回合的分数):表示您获得的最后一个有效 回合的分数是无效的,应该被移除。 每一轮的操作都是永久性的,可能会对前一轮和后一轮产生影响。 你需要返回你在所有回合中得分的总和。 输入输出:

示例 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:c++ 中 的c_str()用法:生成一个const char* 指针

Before we go on , it is important to note here that 题目中给的是一个string 类型的 vector 而 c++ 中有string 类型, 但是! c 语言中 没有,所以 这里引出了 C++ 中的c_str() 用法,为了与C语言兼容。

通过string类对象的成员函数c_str() 把 string 对象转化为c语言字符串样式

注意::一定要使用strcpy()函数来操作c_str()返回的指针。

实践结果:

我们发现,如果用c指针的话,导致的错误是不可想象的,指针的值,会随着s的改变而改变

所以要推荐使用strcpy函数

这样就避免了之前的错误。

2:C语言的atoi()函数

atoi 其实就是 ASCII to integer 

描述:atoi(const char *str) 用来把参数 str 所指向的字符串转化为一个 int 型 ,notice! 这里的形参 是 const char str 类型 ,这也就是我在使用 c_str() 的原因了,为了兼容C语言 ,将string 类型 转化成 char 类型的字符串。

实践代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>   // 注意一下:这是需要引入的库文件喔~

using namespace std;
int main()
{
    const char*c;
    string s ="1234";

    char*p = new char[20];
    
    strcpy(p, s.c_str());
    int k = atoi(p);
    cout << k << endl; // 成功将 string 类型转化为数字
    
 } 

OK啦,这就是这道题里学到的,现在附上这道题代码:(很简单,用到栈,这里就不在说思路了)

class Solution {
public:
    int calPoints(vector<string>& ops) {
        stack<int> sta;
        int sum = 0;
        for(int i = 0 ; i < ops.size() ; i ++)
        {
            if(ops[i] == "+")
            {
                int a = sta.top();
                sta.pop();
                int b = sta.top();
                sta.pop();
                sta.push(b);
                sta.push(a);
                sta.push(a+b);
            }
            
            else if(ops[i] == "D"){
                // sta.push( (ops[i-1] - '0')*2);
                int c = sta.top();
                sta.push(c*2);
            }
            
            else if(ops[i] == "C"){
                sta.pop();
            } 
            
            else{
                // cout << ops[i] << endl;
                // char * str = NULL;
                // *str = ops[i];
                char k[20];
                // i = atoi(ops[i].c_str());
                strcpy(k,ops[i].c_str());
                int kk = atoi(k);
                cout << k << endl;
                 sta.push(kk);
            } 
        }
        
        while(!sta.empty())
        {
            sum+=sta.top();
            sta.pop();
        }
        return sum;
    }
};
原文地址:https://www.cnblogs.com/wtzmz/p/13680663.html