
2026-06-18:计算比赛分数差。用go语言,给定一个整数数组 nums,其中 nums[i] 表示第 i 场比赛中拿到的分数。共有两位玩家:第一位为“主动方”,第二位为“被动方”。
从第 0 场到最后一场依次进行,每场比赛都按下面规则处理:
所有比赛结束后,计算最终分差:第一位玩家的总得分减去第二位玩家的总得分。
1 <= nums.length <= 1000。
1 <= nums[i] <= 1000。
输入: nums = [2,4,2,1,2,1]。
输出: 4。
解释:
第 0 到第 2 场比赛:第一位玩家获得 2 + 4 + 2 = 8 分。
第 3 场比赛:分数为奇数,第二位玩家成为主动玩家,获得 nums[3] = 1 分。
第 4 场比赛:第二位玩家获得 nums[4] = 2 分。
第 5 场比赛:分数为奇数,玩家互换角色。由于这是第 6 场比赛,玩家再次互换角色。第二位玩家获得 nums[5] = 1 分。
分数差为 8 - 4 = 4。
题目来自离开3847。
前置定义:
active记录当前主动方,0=玩家0主动,1=玩家1主动。nums[i]是否为奇数,若是,交换一次主动/被动角色;
步骤2:判断当前索引i是否是5、11、17……(i%6 == 5,每第6场),若是,再交换一次主动/被动角色;
步骤3:交换全部完成后,当前active对应的玩家收下本场nums[i]分数;输入数组:nums = [2,4,2,1,2,1],索引0~5,逐个拆解每一轮完整流程。
初始化状态:
玩家总分:玩家0=8,玩家1=4 分差 = 8 − 4 = 4,与题目输出一致。
数组长度为 n,仅单层循环完整遍历数组一次,每一次循环内部仅包含奇偶取模、取余判断、异或交换、加法赋值,全部为常数 O(1) 操作,无嵌套循环、无递归。 总时间复杂度:O(n),n 为 nums 数组长度。
额外开辟的存储空间固定不变,与输入数组长度 n 无关:
package main
import (
"fmt"
)
func scoreDifference(nums []int)int {
score := [2]int{}
active := 0// 主动玩家一开始是第一位玩家
for i, x := range nums {
active ^= x % 2// 如果 x 是奇数,主动玩家换人
if i%6 == 5 {
active ^= 1// 主动玩家换人
}
score[active] += x
}
return score[0] - score[1]
}
func main() {
nums := []int{2, 4, 2, 1, 2, 1}
result := scoreDifference(nums)
fmt.Println(result)
}

# -*-coding:utf-8-*-
defscore_difference(nums):
score = [0, 0]
active = 0# 主动玩家一开始是第一位玩家
for i, x inenumerate(nums):
active ^= x % 2# 如果 x 是奇数,主动玩家换人
if i % 6 == 5:
active ^= 1# 主动玩家换人
score[active] += x
return score[0] - score[1]
defmain():
nums = [2, 4, 2, 1, 2, 1]
result = score_difference(nums)
print(result)
if __name__ == "__main__":
main()
#include <iostream>
#include <vector>
int scoreDifference(const std::vector<int>& nums) {
int score[2] = {0, 0};
int active = 0; // 主动玩家一开始是第一位玩家
for (size_t i = 0; i < nums.size(); ++i) {
int x = nums[i];
active ^= (x % 2); // 如果 x 是奇数,主动玩家换人
if (i % 6 == 5) {
active ^= 1; // 主动玩家换人
}
score[active] += x;
}
return score[0] - score[1];
}
int main() {
std::vector<int> nums = {2, 4, 2, 1, 2, 1};
int result = scoreDifference(nums);
std::cout << result << std::endl;
return0;
}
