2026-06-18:计算比赛分数差。用go语言,给定一个整数数组 nums,其中 nums[i] 表示第 i 场比赛中拿到的分数。共有两位玩家:第一位为“
🤖 AI总结
主题
Go语言实现计算比赛分数差的算法题解析
摘要
文章解析了一道算法题,用Go语言计算比赛分数差,规则涉及分数奇偶和索引条件交换玩家角色,最终输出分差。
关键信息
- 1 题目规则为根据分数奇偶和索引模6条件交换玩家角色
- 2 提供了Go/Python/C++三种语言的完整代码实现
- 3 最终分差计算示例为4
2026-06-18:计算比赛分数差。用go语言,给定一个整数数组 nums,其中 nums[i] 表示第 i 场比赛中拿到的分数。共有两位玩家:第一位为“主动方”,第二位为“被动方”。
从第 0 场到最后一场依次进行,每场比赛都按下面规则处理:
• 若 nums[i] 是奇数,则本场开始时先交换主动方与被动方的角色。
• 另外,每当进入到第 6 的倍数对应的比赛(索引为 5、11、17、…),也要交换一次主动方与被动方。
• 交换完成后,本场由当前的主动方获得 nums[i] 分。
所有比赛结束后,计算最终分差:第一位玩家的总得分减去第二位玩家的总得分。
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。
一、题目规则完整梳理
前置定义:
1. 两位玩家:玩家0(第一位,初始主动方)、玩家1(第二位,初始被动方);变量active记录当前主动方,0=玩家0主动,1=玩家1主动。
2. 遍历顺序:数组索引 i 从0开始依次处理每场比赛。
3. 每场固定执行顺序:
步骤1:判断当前分数nums[i]是否为奇数,若是,交换一次主动/被动角色;
步骤2:判断当前索引i是否是5、11、17……(i%6 == 5,每第6场),若是,再交换一次主动/被动角色;
步骤3:交换全部完成后,当前active对应的玩家收下本场nums[i]分数;
4. 最终结果 = 玩家0总分 − 玩家1总分。
输入数组:nums = [2,4,2,1,2,1],索引0~5,逐个拆解每一轮完整流程。
二、逐场分步详细推演
初始化状态:
• score = [0, 0] 玩家0总分0,玩家1总分0
• active = 0 初始主动方为玩家0
第1场:i=0,分数x=2
1. 判断x奇偶:2是偶数,不执行角色交换,active保持0;
2. 判断i%6:0%6=0≠5,不执行额外交换,active仍为0;
3. 主动方玩家0收下2分,score更新为 [2, 0];
当前总分:玩家0=2,玩家1=0。
第2场:i=1,分数x=4
1. x=4偶数,无交换,active=0;
2. 1%6=1≠5,无额外交换,active=0;
3. 玩家0收4分,score更新 [6, 0];
当前总分:玩家0=6,玩家1=0。
第3场:i=2,分数x=2
1. x=2偶数,不交换,active=0;
2. 2%6=2≠5,无额外交换,active=0;
3. 玩家0收2分,score更新 [8, 0];
当前总分:玩家0=8,玩家1=0。
第4场:i=3,分数x=1
1. x=1是奇数,执行角色交换:active = 0 ^ 1 = 1;
2. 3%6=3≠5,不触发额外交换,active保持1;
3. 主动方玩家1收1分,score更新 [8, 1];
当前总分:玩家0=8,玩家1=1。
第5场:i=4,分数x=2
1. x=2偶数,不交换,active维持1;
2. 4%6=4≠5,无额外交换,active=1;
3. 玩家1收2分,score更新 [8, 3];
当前总分:玩家0=8,玩家1=3。
第6场:i=5,分数x=1(关键,i%6=5触发二次交换)
1. x=1是奇数,第一次交换角色:active = 1 ^ 1 = 0;
2. 判断i%6:5%6=5,满足条件,执行第二次角色交换:active = 0 ^ 1 = 1;
3. 两次交换结束,当前主动方是玩家1,收下1分,score更新 [8, 4];
当前总分:玩家0=8,玩家1=4。
三、最终分差计算
玩家总分:玩家0=8,玩家1=4
分差 = 8 − 4 = 4,与题目输出一致。
四、复杂度分析 1. 时间复杂度
数组长度为 n,仅单层循环完整遍历数组一次,每一次循环内部仅包含奇偶取模、取余判断、异或交换、加法赋值,全部为常数 O(1) 操作,无嵌套循环、无递归。
总时间复杂度:O(n),n 为 nums 数组长度。
2. 额外空间复杂度
额外开辟的存储空间固定不变,与输入数组长度 n 无关:
• 定长数组 score [2]:固定2个int;
• 变量 active、循环变量i、临时x:单个基础整型;
不存在动态数组、切片、哈希表等随n扩容的空间。
总额外空间复杂度:O(1)(常数级空间)。
Go完整代码如下:
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)
}
![]()
Python完整代码如下:
# -*-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()
![]()
C++完整代码如下:
#include
#include
int scoreDifference(const std::vector& 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 nums = {2, 4, 2, 1, 2, 1};
int result = scoreDifference(nums);
std::cout << result << std::endl;
return0;
}
![]()
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。