2026-08-16:分数验证器。用go语言,初始时分数和计数都为 0。按从左到右的顺序处理事件列表:如果当前项是数字字符串“0”“1”“2”“3”“4”或“6

10 阅读4分钟

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"10
"4"50
"W"51
"6"111
"WD"121

最终结果:[12, 1]。

题目来自力扣3921。

处理过程详述

  1. 初始化状态
    一开始,总得分 score 为 0,计数器 counter 为 0。这两个变量用来记录当前累计的结果。

  2. 从左到右逐个处理事件
    程序会按顺序读取 events 数组中的每一个字符串元素,对每个元素执行相应的操作。

  3. 判断当前事件类型并更新状态
    对于当前事件字符串,有三种可能的情况:

    • 当前事件是 "W"
      表示一次计分前的“警告”或“宽球”事件。此时只把计数器 counter 加 1,总得分 score 保持不变。
      加完后会立即检查:如果 counter 已经等于 10,就马上停止处理,不再继续看后面的任何事件。

    • 当前事件长度大于 1,即 "WD""NB"
      这两种事件都表示额外加 1 分。此时只把总得分 score 加 1,计数器 counter 保持不变。
      因为计数器没有变化,所以不可能在这一步达到 10,也就不需要额外检查停止条件。

    • 当前事件是单个数字字符,即 "0""1""2""3""4""6" 之一
      表示正常得分事件。此时把该数字字符转换成对应的整数值,加到总得分 score 上。
      计数器 counter 保持不变。

  4. 循环继续或提前结束
    如果当前事件是 "W" 且计数器达到 10,循环会提前结束。
    否则,继续处理下一个事件,直到所有事件都处理完。

  5. 返回最终结果
    循环结束后,把最终的 scorecounter 组合成一个长度为 2 的整数数组返回,第一个元素是总得分,第二个元素是计数器值。

示例走查

以输入 events = ["1","4","W","6","WD"] 为例:

  • 初始:score = 0counter = 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 的长度。

  • 额外空间复杂度
    整个过程中只使用了两个整数变量 scorecounter,以及最终返回的固定长度数组。这些空间都不随输入规模增长,所以额外空间复杂度为 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;
}

在这里插入图片描述