跳转至

3847. 计算比赛分数差

题目描述

给你一个整数数组 nums,其中 nums[i] 表示在第 i 场比赛中获得的分数。

恰好 有两位玩家。初始时,第一位玩家为 主动玩家,第二位玩家为 被动玩家

按顺序 将下述规则应用于每场比赛 i

  • 如果 nums[i] 是奇数,主动玩家和被动玩家互换角色。
  • 在每第 6 场比赛(即比赛索引为 5, 11, 17, ... 的比赛中),主动玩家和被动玩家互换角色。
  • 主动玩家参与第 i 场比赛,并获得 nums[i] 分。

返回 分数差,即第一位玩家的 总分 减去第二位玩家的 总分 

 

示例 1:

输入: nums = [1,2,3]

输出: 0

解释:​​​​​​​

  • 第 0 场比赛:分数为奇数,第二位玩家成为主动玩家,获得 nums[0] = 1 分。
  • 第 1 场比赛:没有交换角色。第二位玩家获得 nums[1] = 2 分。
  • 第 2 场比赛:分数为奇数,第一位玩家成为主动玩家,获得 nums[2] = 3 分。
  • 分数差为 3 - 3 = 0

示例 2:

输入: 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

示例 3:

输入: nums = [1]

输出: -1

解释:

  • 第 0 场比赛:分数为奇数,第二位玩家成为主动玩家,获得 nums[0] = 1 分。
  • 分数差为 0 - 1 = -1

 

提示:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 1000

解法

方法一:模拟

我们用一个变量 \(k\) 来表示当前玩家的角色,初始时 \(k = 1\),当 \(k = 1\) 时表示第一位玩家是主动玩家,当 \(k = -1\) 时表示第二位玩家是主动玩家。对于每场比赛,我们根据题目描述更新 \(k\) 的值,并将当前比赛的分数乘以 \(k\) 加到答案中。最后返回答案即可。

时间复杂度 \(O(n)\),其中 \(n\) 是数组 \(\textit{nums}\) 的长度。空间复杂度 \(O(1)\)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Solution:
    def scoreDifference(self, nums: List[int]) -> int:
        ans, k = 0, 1
        for i, x in enumerate(nums):
            if x % 2:
                k *= -1
            if i % 6 == 5:
                k *= -1
            ans += k * x
        return ans
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
class Solution {
    public int scoreDifference(int[] nums) {
        int ans = 0;
        int k = 1;
        for (int i = 0; i < nums.length; ++i) {
            int x = nums[i];
            if ((x & 1) == 1) {
                k = -k;
            }
            if (i % 6 == 5) {
                k = -k;
            }
            ans += k * x;
        }
        return ans;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class Solution {
public:
    int scoreDifference(vector<int>& nums) {
        int ans = 0;
        int k = 1;
        for (int i = 0; i < nums.size(); ++i) {
            int x = nums[i];
            if (x & 1) {
                k = -k;
            }
            if (i % 6 == 5) {
                k = -k;
            }
            ans += k * x;
        }
        return ans;
    }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
func scoreDifference(nums []int) int {
    ans := 0
    k := 1
    for i, x := range nums {
        if x%2 != 0 {
            k = -k
        }
        if i%6 == 5 {
            k = -k
        }
        ans += k * x
    }
    return ans
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
function scoreDifference(nums: number[]): number {
    let ans = 0;
    let k = 1;

    nums.forEach((x, i) => {
        if (x % 2 !== 0) {
            k = -k;
        }
        if (i % 6 === 5) {
            k = -k;
        }
        ans += k * x;
    });

    return ans;
}

评论