一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第30天,点击查看活动详情
🎉前言
为什么要学习算法?因为 「程序=数据结构+算法」 ,这是在面向过程的编程语言年代备受推崇的一句话,拥有良好的算法基础才能在人群之中脱颖而出。人们设计各种算法的目的是解决现实问题,所以学好算法才能站在一个更高维度来看待问题。
⚾️ 什么是棒球比赛
你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。
比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表
ops,其中ops[i]是你需要记录的第i项操作,ops遵循下述规则:
- 整数
x- 表示本回合新获得分数x"+"- 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。"D"- 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。"C"- 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。- 请你返回记录中所有得分的总和。
// 示例
输入:ops = ["5","-2","4","C","D","9","+","+"]
输出:27
解释:
"5" - 记录加 5 ,记录现在是 [5]
"-2" - 记录加 -2 ,记录现在是 [5, -2]
"4" - 记录加 4 ,记录现在是 [5, -2, 4]
"C" - 使前一次得分的记录无效并将其移除,记录现在是 [5, -2]
"D" - 记录加 2 * -2 = -4 ,记录现在是 [5, -2, -4]
"9" - 记录加 9 ,记录现在是 [5, -2, -4, 9]
"+" - 记录加 -4 + 9 = 5 ,记录现在是 [5, -2, -4, 9, 5]
"+" - 记录加 9 + 5 = 14 ,记录现在是 [5, -2, -4, 9, 5, 14]
所有得分的总和 5 + -2 + -4 + 9 + 5 + 14 = 27
❓ 比赛侧写
从上述示例中,我们可以获得以下知识点:
- 如果是
C,移除数组最后一位元素。 - 如果是
D,前一个分数的双倍并插入到数组中。 - 如果是
+,前两个分数的总和并插入到数组中。 - 如果是
number(number有正数和负数),插入到数组中。
👀 代码实现
let calPoints = function(ops) {
// 定义变量数组,保存结果
// 遍历 ops
// 每次循环都获取一次resultArr的长度,因为resultArr每一轮循环都在变
// 如果是 C ,弹出数组的最后一位
// 如果是 D ,前一个分数的双倍并插入到数组中
// 如果是 + ,前两个分数的总和并插入到数组中
// 如果是number,插入到数组中
// 返回累加求和
}
先把思路用伪代码的形式写出来,这样的好处多多哦,希望大家可以有这样的习惯~~
具体代码实现:
let calPoints = function(ops) {
// 定义变量数组,保存结果
let resultArr = [];
// 遍历 ops
for (let i = 0; i < ops.length; i++) {
// 每次循环都获取一次resultArr的长度,因为resultArr每一轮循环都在变
const k = resultArr.length;
// 如果是 C ,弹出数组的最后一位
if (ops[i] === 'C') {
resultArr.pop();
}
// 如果是 D ,前一个分数的双倍并插入到数组中
else if (ops[i] === 'D') {
resultArr.push(resultArr[k-1] * 2);
}
// 如果是 + ,前两个分数的总和并插入到数组中
else if (ops[i] === '+') {
resultArr.push(resultArr[k-1] + resultArr[k-2]);
}
// 如果是number,插入到数组中
else if(Number(ops[i]) !== NaN) {
resultArr.push(Number(ops[i]));
}
}
// 返回累加求和
return resultArr.reduce((total, curVal) => {
return total + curVal;
})
}
代码测试:
const ops = ["5","-2","4","C","D","9","+","+"];
console.log(calPoints(ops)); // 27
✨总结
以上就是本次分享的全部内容~~
如果觉得文章写得不错,对你有所启发的,请不要吝啬 点个 赞 和 关注 并在 评论区 留下你宝贵的意见哦~~😃