📘 題目敘述
給你一個整數陣列 nums,其中 nums[i] 表示第 i 場遊戲所得到的分數。
有且只有兩位玩家。一開始第一位玩家是 active,第二位玩家是 inactive。
對於每一場遊戲 i,會依序套用以下規則:
- 如果
nums[i]是奇數,active 和 inactive 的玩家交換角色。 - 每逢第 6 場遊戲(遊戲索引
5, 11, 17, ...),active 和 inactive 的玩家交換角色。 - active 玩家會玩第
i場遊戲並獲得nums[i]分數。
請回傳分數差(score difference),定義為第一位玩家總分減去第二位玩家總分。
條件限制
1 <= nums.length <= 10001 <= nums[i] <= 1000
🧠 解題思路
我這題就是照規則逐場模擬。
我用布林值 act 表示目前 active 的是不是第一位玩家:
act == true:第一位玩家 activeact == false:第二位玩家 active
每一場遊戲都照題目順序先處理交換規則,再加分;最後回傳 first - second。
所有變數
n:遊戲場數(nums.size())act:目前 active 的是不是第一位玩家first:第一位玩家累積總分second:第二位玩家累積總分
🪜 主要流程步驟
1. 初始化狀態
把 act = true,並將 first = 0、second = 0。
2. 逐場處理遊戲
若 nums[i] 是奇數就先 act = !act;若 (i + 1) % 6 == 0 再 act = !act;最後把分數加到目前 active 玩家。
3. 回傳分數差
迴圈結束後回傳 first - second。
⏱️ 複雜度
- 時間複雜度:
O(n) - 空間複雜度:
O(1)
💻 程式碼實作
class Solution {
public:
int scoreDifference(vector<int>& nums) {
int n = nums.size();
bool act = true;
int first = 0, second = 0;
for (int i = 0; i < n; i++) {
if (nums[i] % 2 == 1) {
act = !act;
}
if ((i + 1) % 6 == 0) {
act = !act;
}
if (act) {
first += nums[i];
} else {
second += nums[i];
}
}
return first - second;
}
};
🔗 題目連結
https://leetcode.com/problems/find-the-score-difference-in-a-game/