【华为OD机试】投篮大赛 100分
语雀原文链接
文章目录
- 1、题目
- 2、解法
1、题目
- 2025年A卷
- 题目名称:投篮大赛
- 知识点:字符串、栈操作、逻辑处理
- 时间限制:1秒
- 空间限制:256MB
- 限定语言:不限
- 题目描述
你作为一场特殊赛制投篮大赛的记录员,需根据操作字符串列表 ops 记录得分。规则如下:
整数 x:当前回合得分为 x,直接记录。
+:当前回合得分为前两回合有效得分之和。
D:当前回合得分为前一回合有效得分的两倍。
C:当前回合无得分,且前一回合得分无效(需移除)。
最终返回所有有效得分的总和。若操作过程中出现异常(如操作符无法执行),返回 -1。
- 输入输出格式
输入:字符串数组 ops,元素为整数或操作符(C、D、+)。
输出:整型数字,总得分或 -1(异常时)。
约束条件:
1 <= ops.length <= 1000
整数范围:[-310^4, 310^4]
需处理以下异常:
- 操作时,前两有效得分不存在。
C/D 操作时,前一有效得分不存在。
- 示例
示例1
输入:5 2 C D +
输出:30
解释:
5 → 记录 [5]
2 → 记录 [5, 2]
C → 移除 2,记录 [5]
D → 记录 5*2=10 → [5, 10]
- → 记录 5+10=15 → [5, 10, 15]
总和:5+10+15=30
示例2
输入:+
输出:-1
解释:+ 操作时栈中无足够元素,触发异常。
2、解法
- 思路:处理C和D是集合长度需要大于0,处理+的时候集合长度需要大于1,不满足则返回-1
- 代码
import java.util.*;public class Test {public static int calPoints(String[] ops) {List<Integer> points = new ArrayList<>();for (String s : ops) {int size = points.size();switch (s) {case "+":if (size < 2) {return -1;}points.add(points.get(size - 1) + points.get(size - 2));break;case "D":if (points.isEmpty()) {return -1;}points.add(points.get(size - 1) * 2);break;case "C":if (points.isEmpty()) {return -1;}points.remove(size - 1);break;default:int num;try {num = Integer.parseInt(s);} catch (Exception e) {return -1;}points.add(num);break;}}int sum = 0;for (Integer a : points) {sum += a;}return sum;}public static void main(String[] args) {System.out.println(calPoints(new String[]{"5", "2", "C", "D", "+"})); // 30System.out.println(calPoints(new String[]{"5", "-2", "4", "C", "D", "9", "+", "+"})); // 27System.out.println(calPoints(new String[]{"5", "C", "D"})); // -1System.out.println(calPoints(new String[]{"5", "6", "C", "+"})); // -1System.out.println(calPoints(new String[]{"+"})); // -1}
}