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出现的情况