?目錄鏈接:
力扣編程題-解法匯總_分享+記錄-CSDN博客
GitHub同步刷題項目:
https://github.com/September26/java-algorithms
原題鏈接:
力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺
描述:
n
?個朋友在玩游戲。這些朋友坐成一個圈,按?順時針方向?從?1
?到?n
?編號。從第?i
?個朋友的位置開始順時針移動?1
?步會到達第?(i + 1)
?個朋友的位置(1 <= i < n
),而從第?n
?個朋友的位置開始順時針移動?1
?步會回到第?1
?個朋友的位置。
游戲規則如下:
第?1
?個朋友接球。
- 接著,第?
1
?個朋友將球傳給距離他順時針方向?k
?步的朋友。 - 然后,接球的朋友應該把球傳給距離他順時針方向?
2 * k
?步的朋友。 - 接著,接球的朋友應該把球傳給距離他順時針方向?
3 * k
?步的朋友,以此類推。
換句話說,在第?i
?輪中持有球的那位朋友需要將球傳遞給距離他順時針方向?i * k
?步的朋友。
當某個朋友第 2 次接到球時,游戲結束。
在整場游戲中沒有接到過球的朋友是?輸家?。
給你參與游戲的朋友數量?n
?和一個整數?k
?,請按升序排列返回包含所有輸家編號的數組?answer
?作為答案。
示例 1:
輸入:n = 5, k = 2
輸出:[4,5]
解釋:以下為游戲進行情況:
1)第 1 個朋友接球,第 1
個朋友將球傳給距離他順時針方向 2 步的玩家 —— 第 3 個朋友。
2)第 3 個朋友將球傳給距離他順時針方向 4 步的玩家 —— 第 2 個朋友。
3)第 2 個朋友將球傳給距離他順時針方向 6 步的玩家 —— 第 3 個朋友。
4)第 3 個朋友接到兩次球,游戲結束。
示例 2:
輸入:n = 4, k = 4
輸出:[2,3,4]
解釋:以下為游戲進行情況:
1)第 1 個朋友接球,第 1
個朋友將球傳給距離他順時針方向 4 步的玩家 —— 第 1 個朋友。
2)第 1 個朋友接到兩次球,游戲結束。
提示:
1 <= k <= n <= 50
解題思路:
* 2682. 找出轉圈游戲輸家
* 解題思路:
* 每次求新的傳球位置,先求出下一個位置,然后和n求余就可以了。公式為:(lastPosition + index * k) % n;
* 把每一個位置都加到set中,然后遍歷1到n的位置,如果在set中,則不再set中,則說明是沒有接到過球的,就加入到answer中。
代碼:
class Solution2682
{
public:vector<int> circularGameLosers(int n, int k){set<int> set;int lastPosition = 0;int index = 1;set.insert(0);while (true){int position = (lastPosition + index * k) % n;if (set.find(position) != set.end()){break;}index++;set.insert(position);lastPosition = position;}vector<int> answer;for (int i = 1; i <= n; i++){if (set.find(i - 1) != set.end()){continue;}answer.push_back(i);}return answer;}
};