投篮大赛问题

一、题目描述

你现在是一场采用特殊赛制投篮大赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。

比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中opsi是你需要记录的第i项操作,ops遵循下述规则:

  1. 整数x-表示本回合新获得分数x
  2. "+" -- 表示本回合新获得的得分是前两次得分的总和。
  3. "D" -- 表示本回合新获得的得分是前一次得分的两倍。
  4. "C" -- 表示本回合没有分数,并且前一次得分无效,将其从记录中移除。

请你返回记录中所有得分的总和。

二、输入输出描述

输入描述
  • 一行字符串,表示操作序列(用空格分隔)
输出描述
  • 一个整数,表示所有得分总和

三、示例

|----|-------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 输入 | 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 |

四、解题思路

1. 核心思想

使用栈(Stack) 这种后进先出 的数据结构,完美匹配操作只影响最近一次 / 两次得分的规则,按顺序处理所有操作,最后累加栈中所有有效得分。

2. 问题本质分析

这是一个带历史回退操作的序列计算问题

  • 所有操作(C/D/+)都只针对最近的得分
  • 需要频繁获取、撤销、计算最近的记录
  • 本质:用栈维护有序的历史记录 + 按规则更新栈 + 最终求和

3. 核心逻辑

  1. 遍历每个操作,只操作栈顶元素(最近得分);
  2. 数字直接入栈;C 弹出栈顶(撤销);D 复制栈顶翻倍;+ 取栈顶两个数求和;
  3. 所有操作完成后,栈中存储的就是全部有效得分
  4. 遍历栈求和,输出结果。

4. 步骤拆解

  1. 输入处理读取一行字符串,按空格分割成操作数组。

  2. 栈初始化创建空栈,用于存储每一轮的有效得分。

  3. 遍历处理操作

    • 数字:入栈
    • C:栈顶出栈(撤销)
    • D:栈顶 ×2 入栈
    • +:取栈顶两个数求和后入栈
  4. 计算总得分遍历栈中所有元素,累加得到最终结果。

  5. 输出总和

五、代码实现

java 复制代码
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] ops = sc.nextLine().split(" ");
        
        Stack<Integer> stack = new Stack<>();
        
        for (String op : ops) {
            if (op.equals("C")) {
                // 前一次得分无效
                stack.pop();
            } else if (op.equals("D")) {
                // 前一次得分翻倍
                stack.push(stack.peek() * 2);
            } else if (op.equals("+")) {
                // 前两次之和
                int last1 = stack.pop();
                int last2 = stack.peek();
                stack.push(last1);
                stack.push(last1 + last2);
            } else {
                // 数字,直接入栈
                stack.push(Integer.parseInt(op));
            }
        }
        
        // 计算总和
        int sum = 0;
        for (int num : stack) {
            sum += num;
        }
        System.out.println(sum);
    }
}
相关推荐
社交怪人2 分钟前
【奇偶ASCII值】信息学奥赛一本通C语言解法(题号1042)
算法
李二。2 分钟前
鸿蒙原生ArkTS-系外行星百科AI
人工智能·华为·harmonyos
牛油果子哥q3 分钟前
【C++指针与引用】C++指针与引用底层彻底精讲:本质区别、易错深坑、底层内存模型、工程选型、笔试面试满分解析
c++·面试
我登哥MVP7 分钟前
Spring Boo从“会用”到“精通”:Spring Boot 入门
java·spring boot·后端·spring·maven·intellij-idea·mybatis
染翰12 分钟前
Java 实现 Git 自动克隆工具,打包成 Windows 独立 EXE(免安装JDK)
java·git·后端
想你依然心痛15 分钟前
HarmonyOS 6(API 23)实战:构建“光愈冥想舱“——智能情绪疗愈系统
华为·ar·harmonyos·智能体
七老板的blog20 分钟前
多阶段 AI 评测流水线架构设计与实践
java·人工智能·spring
小欣加油20 分钟前
leetcode3635 最早完成陆地和水上游乐设施的时间II
数据结构·c++·算法·leetcode
qq_4581482026 分钟前
科大讯飞实时语音识别(rtasr)真实项目踩坑经验总结与手把手教学真实可运行Demo
java·开发语言·websocket·语音识别
创业之路&下一个五年29 分钟前
mvvm中v和vm关系,vm中v和m的关系?
java·开发语言·javascript