华为OD机试真题 Java 实现【投篮大赛】【2023Q1 100分】-LMLPHP

一、题目描述

你现在是一场采用特殊赛制投篮大赛的记录员。

这场比赛由若于回合组成,过去几回合的得分可能会影响以后几回合的得分,比赛开始时,记录是空白的。

你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第i项操作,ops 遵循下述规则:

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

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

二、输入描述

输入为一个字符串数组。

三、输出描述

输出为一个整形数字。

四、Java算法源码

/**
 * +:表示本回合新获得的得分是前两次得分的总和;
 * C:表示本回合没有分数,并且前一次得分无效,将其从记录中移除;
 * D:表示本回合新获得的得分是前一次得分的两倍;
 */
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String line = sc.nextLine();
    String[] arr = line.split(" ");
    Deque<Integer> list = new LinkedList<>();
    for (String str : arr) {
        if ("CD+".contains(str)) {
            if (list.size() == 0) {
                System.out.println(-1);
                break;
            }

            switch (str){
                // 表示本回合新获得的得分是前两次得分的总和
                case "+":
                    // 此时,list元素个数必须大于等于2,至少有两个元素
                    if (list.size() < 2) {
                        System.out.println(-1);
                        break;
                    }
                    // 当前队列的尾部
                    Integer last = list.pollLast();
                    // 尾部的前一个
                    Integer preLast = list.pollLast();
                    // 使用"+"元素后,新的尾部
                    Integer curLast = preLast + last;
                    list.add(preLast);
                    list.add(last);
                    list.add(curLast);
                    break;
                case "C":
                    // 表示本回合没有分数,并且前一次得分无效,将其从记录中移除;
                    list.removeLast();
                    break;
                case "D":
                    // 表示本回合新获得的得分是前一次得分的两倍;
                    Integer pre = list.getLast();
                    list.addLast(pre * 2);
                    break;
                default:
                    break;
            }
        }else {
            list.add(Integer.parseInt(str));
        }
    }

    int sum = 0;
    for (int num: list) {
        sum += num;
    }
    System.out.println(sum);
}

五、效果展示

1、输入

3 2 2 + 3 C 2 D

2、输出

17

3、说明

哪吒投了一个超远4分、又投了两个中距离3分,

+:表示本回合新获得的得分是前两次得分的总和;

4 + 3 + (3 + 3)

哪吒又投了一个超远4分,可惜犯规了C,4分不算。

C:表示本回合没有分数,并且前一次得分无效,将其从记录中移除;

4 + 3 + (3 + 3) + 4 - 4

哪吒又投了一个3分,

D:表示本回合新获得的得分是前一次得分的两倍;

卧槽,爆珠了,翻倍、

4 3 3 + 4 C 3 D

4 + 3 + 3 + (3 + 3) + 4 - 4 + 3 + (3 * 2) = 25

哪吒参加三分大赛,以25分的高分,力压斯蒂芬库里夺得三分大赛冠军。

华为OD机试真题 Java 实现【投篮大赛】【2023Q1 100分】-LMLPHP

华为OD机试真题 Java 实现【投篮大赛】【2023Q1 100分】-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【不爱施肥的小布】【2023Q2 100分】

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

华为OD机试真题 Java 实现【投篮大赛】【2023Q1 100分】-LMLPHP

05-18 01:20