一、题目描述
你现在是一场采用特殊赛制投篮大赛的记录员。
这场比赛由若于回合组成,过去几回合的得分可能会影响以后几回合的得分,比赛开始时,记录是空白的。
你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第i项操作,ops 遵循下述规则:
- 整数 x - 表示本回合新获得分数 x;
- "+” 表示本回合新获得的得分是前两次得分的总和;
- “D” 表示本回合新获得的得分是前一次得分的两倍;
- “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 实现【不爱施肥的小布】【2023Q2 100分】
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。