2026-08-16:分数验证器。用go语言,初始时分数和计数都为 0。按从左到右的顺序处理事件列表:如果当前项是数字字符串“0”“1”“2”“3”“4”或“6”,就把对应数字加到分数上;如果是“W”,只把计数加 1,分数不变;如果是“WD”或“NB”,只把分数加 1,计数不变。每处理完一项后检查:如果已经处理到列表末尾,或者计数已经达到 10,就立即停止,不再处理后续内容。最后返回两个整数,依次表示最终分数和最终计数。
1 <= events.length <= 1000。
events[i] 是 "0"、"1"、"2"、"3"、"4"、"6"、"W"、"WD" 或 "NB" 之一。
输入: events = ["1","4","W","6","WD"]。
输出: [12,1]。
解释:
| 事件 | 得分 | 计数器 |
|---|---|---|
| "1" | 1 | 0 |
| "4" | 5 | 0 |
| "W" | 5 | 1 |
| "6" | 11 | 1 |
| "WD" | 12 | 1 |
最终结果:[12, 1]。
题目来自力扣3921。
处理过程详述
-
初始化状态
一开始,总得分score为 0,计数器counter为 0。这两个变量用来记录当前累计的结果。 -
从左到右逐个处理事件
程序会按顺序读取events数组中的每一个字符串元素,对每个元素执行相应的操作。 -
判断当前事件类型并更新状态
对于当前事件字符串,有三种可能的情况:-
当前事件是
"W"
表示一次计分前的“警告”或“宽球”事件。此时只把计数器counter加 1,总得分score保持不变。
加完后会立即检查:如果counter已经等于 10,就马上停止处理,不再继续看后面的任何事件。 -
当前事件长度大于 1,即
"WD"或"NB"
这两种事件都表示额外加 1 分。此时只把总得分score加 1,计数器counter保持不变。
因为计数器没有变化,所以不可能在这一步达到 10,也就不需要额外检查停止条件。 -
当前事件是单个数字字符,即
"0"、"1"、"2"、"3"、"4"、"6"之一
表示正常得分事件。此时把该数字字符转换成对应的整数值,加到总得分score上。
计数器counter保持不变。
-
-
循环继续或提前结束
如果当前事件是"W"且计数器达到 10,循环会提前结束。
否则,继续处理下一个事件,直到所有事件都处理完。 -
返回最终结果
循环结束后,把最终的score和counter组合成一个长度为 2 的整数数组返回,第一个元素是总得分,第二个元素是计数器值。
示例走查
以输入 events = ["1","4","W","6","WD"] 为例:
- 初始:
score = 0,counter = 0 - 处理
"1":数字 1,score = 0 + 1 = 1 - 处理
"4":数字 4,score = 1 + 4 = 5 - 处理
"W":计数器加 1,counter = 1,未达到 10,继续 - 处理
"6":数字 6,score = 5 + 6 = 11 - 处理
"WD":长度大于 1,score = 11 + 1 = 12 - 所有事件处理完毕,返回
[12, 1]
复杂度分析
-
时间复杂度:
最坏情况下需要遍历整个events数组一次。每个事件只进行常数次判断和简单加法操作,因此总时间复杂度为 O(n),其中 n 是events的长度。 -
额外空间复杂度:
整个过程中只使用了两个整数变量score和counter,以及最终返回的固定长度数组。这些空间都不随输入规模增长,所以额外空间复杂度为 O(1)。
Go完整代码如下:
package main
import (
"fmt"
)
func scoreValidator(events []string) []int {
score, counter := 0, 0
for _, s := range events {
if s == "W" {
counter++
if counter == 10 {
break
}
} else if len(s) > 1 { // "WD" "NB"
score++
} else { // 数字
score += int(s[0] - '0')
}
}
return []int{score, counter}
}
func main() {
events := []string{"1", "4", "W", "6", "WD"}
result := scoreValidator(events)
fmt.Println(result)
}
Python完整代码如下:
# -*-coding:utf-8-*-
def score_validator(events):
score = 0
counter = 0
for s in events:
if s == "W":
counter += 1
if counter == 10:
break
elif len(s) > 1: # "WD" 或 "NB"
score += 1
else: # 单个数字字符串
score += int(s)
return [score, counter]
if __name__ == "__main__":
events = ["1", "4", "W", "6", "WD"]
result = score_validator(events)
print(result)
C++完整代码如下:
#include <iostream>
#include <vector>
#include <string>
std::vector<int> scoreValidator(const std::vector<std::string>& events) {
int score = 0;
int counter = 0;
for (const std::string& s : events) {
if (s == "W") {
counter++;
if (counter == 10) {
break;
}
} else if (s.length() > 1) { // "WD" 或 "NB"
score++;
} else { // 单个数字字符
score += s[0] - '0';
}
}
return {score, counter};
}
int main() {
std::vector<std::string> events = {"1", "4", "W", "6", "WD"};
std::vector<int> result = scoreValidator(events);
std::cout << "[" << result[0] << ", " << result[1] << "]" << std::endl;
return 0;
}