1 题目

/**
 * 青蛙(frog)杯第一届棒球比赛开赛啦。
 * 你现在是一名记分员,输入一个字符串数组(比赛记录情况),按如下规则计分:
 * 1. 如果该字符串是数字:代表当轮比赛的得分情况。
 * 2. 如果该字符串是“+”: 代表当轮比赛得分情况为上两轮之和。
 * 3. 如果该字符串是“C”: 代表上一轮得分无效。
 * 4. 如果该字符串是“D”:  代表当轮比赛得分为上一轮得分的两倍。
 * 你需要得出最后总的得分情况并返回结果。
 */

2 题解

2.1 解题思路

这是一道简单的字符串处理问题,只需要稍微注意一下处理过程即可。

首先这里设置了几个辅助数组,分别是score,valid

valid数组用来标记得分是否有效,score数组用来记录每一轮得分情况

接下来依次更新score和valid的值即可

2.2 解题图示

2.3 结果图示



2.4 结果分析

时间复杂度:O(logn),空间复杂度:O(n)

2.5 代码

int main(){
    string str;
    srand(unsigned(time(0)));
    int n = getRandomNumber(10,20);
    int* score = (int *)malloc(n*sizeof (int ));
    int* valid = (int *)malloc(n*sizeof (int ));
    for (int i = 0; i < n; ++i) {
        valid[i] = 1;
    }
    for (int i = 0; i < n; ++i) {
        int num = getRandomNumber(1,9);
        if (i < 3 || num <= 4){
            int nn = getRandomNumber(1,9);
            str.append(to_string(nn));
        } else if(num <= 6){
            str.append("+");
        } else if (num <= 8){
            str.append("C");
        } else{
            str.append("D");
        }
    }
    for (int i = 0; i < n; ++i) {
        if (str[i]>='0' || str[i] <='9'){
            score[i] = str[i] - '0';
        }
        if (str[i] == 'C'){
            int ii = i;
            while (valid[--ii]!=1);
            valid[ii] = 0;
            valid[i] = 0;
            score[i] = 0;
        }
        if(str[i] == 'D'){
            int ii = i;
            while (valid[--ii]!=1);
            score[i] = score[ii]*2;
        }
        if(str[i] == '+'){
            int ii = i;
            while (valid[--ii]!=1);
            int jj = ii;
            while (valid[--jj]!=1);
            score[i] = score[ii] + score[jj];
        }
    }
    int sum = 0;
    for (int i = 0; i < n; ++i) {
        if (valid[i] == 0){
            score[i] = -1;
        } else{
            sum += score[i];
        }
    }
    cout<<"string:\t";
    for (int i = 0; i < str.length(); ++i) {
        cout<<str[i]<<"\t";
    }
    cout<<endl;
    cout<<"valid:\t";
    print_arr(valid,n);
    cout<<"score:\t";
    print_arr(score,n);
    cout<<"sum:\t";
    cout<<sum;
    return 0;
}

2.6 附注

这里确实让我懂了i–和–i的区别了

while (valid[--ii]!=1);

debug都能给我报错了

调试器进程已结束,退出代码为 -1073741819 (0xC0000005)。

还有就是注意一下双C出现的情况