Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。
比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:
整数 x - 表示本回合新获得分数 x "+" - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。 "D" - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。 "C" - 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。 请你返回记录中所有得分的总和。
示例 1:
输入:ops = ["5","2","C","D","+"] 输出:30 解释: "5" - 记录加 5 ,记录现在是 [5] "2" - 记录加 2 ,记录现在是 [5, 2] "C" - 使前一次得分的记录无效并将其移除,记录现在是 [5]. "D" - 记录加 2 * 5 = 10 ,记录现在是 [5, 10]. "+" - 记录加 5 + 10 = 15 ,记录现在是 [5, 10, 15]. 所有得分的总和 5 + 10 + 15 = 30
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ba… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
题目读懂了这题其实也就会做了,我们直接模拟整个过程,遍历整个数组,如果遇到是数字那么就直接跳过,如果遇到的是字符那么就回去找前面的数字进行对应的操作处理,注意这里的删除不用我们真的去删除,我们只要把它置为一个原数组中不存在的字符就可以了,比如我这里得#号就是,最后我们只需要对保留在数组中的数字进行累计求和那么答案就出来了。
三、AC 代码:
代码一:
/**
* @param {string[]} ops
* @return {number}
*/
var calPoints = function(ops) {
let index=0;
while(index<ops.length){
if(!isNaN(ops[index])){
index++;
continue;
}
if(ops[index]==="+"){
let back1=index-1;
while(isNaN(ops[back1])){
back1--;
}
let back2=back1-1;
while(isNaN(ops[back2])){
back2--;
}
ops[index]=ops[back2]*1+ops[back1]*1;
index++;
continue;
}
if(ops[index]==='D'){
let back1=index-1;
while(isNaN(ops[back1])){
back1--;
}
ops[index]=ops[back1]*2;
index++;
continue;
}
if(ops[index]==='C'){
let back1=index-1;
while(isNaN(ops[back1])){
back1--;
}
ops[index]="#";
ops[back1]="#";
index++;
}
}
let sum=0;
for(let i=0;i<ops.length;i++){
if(ops[i]!=="#"){
sum+=ops[i]*1;
}
}
return sum;
};
四、总结:
对待一些简单的问题,有时候直接模拟也是一种很好的方法。