สมมติว่าเรามีอาร์เรย์ที่เรียกว่า nums โดยที่ nums[i] ถูกเขียนบนกระดานดำ Ram และ Sam ผลัดกันลบหนึ่งองค์ประกอบออกจากกระดาน โดยที่ Ram เริ่มก่อน หากการลบตัวเลขทำให้ XOR ระดับบิตขององค์ประกอบทั้งหมดของกระดานดำกลายเป็น 0 ผู้เล่นคนนั้นจะแพ้ Bitwise XOR ขององค์ประกอบหนึ่งคือองค์ประกอบนั้น และ XOR ระดับบิตที่ไม่มีองค์ประกอบใดๆ จะเป็น 0 หากผู้เล่นคนใดเริ่มเทิร์นด้วย XOR ระดับบิตขององค์ประกอบทั้งหมดของกระดานดำเท่ากับ 0 ผู้เล่นนั้นจะเป็นผู้ชนะ สมมติว่าอาร์เรย์ถือ [1, 2, 1] ดังนั้น Ram สามารถลบ 1 หรือ 2 หาก Ram ลบ 1 อาร์เรย์จะเป็น [2,1] เนื่องจาก XOR ขององค์ประกอบ 1 XOR 2 =3 ตอนนี้ Sam สามารถทำได้ ลบองค์ประกอบใด ๆ เพราะ Ram จะเป็นคนลบองค์ประกอบสุดท้ายและเขาจะสูญเสีย ถ้าเขาเลือก 2 เพื่อลบก่อน อาร์เรย์จะกลายเป็น [1,1] XOR เป็น 0 ดังนั้น Ram จะสูญเสียพี>
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- n :=ขนาดของ nums
- x :=0
- สำหรับองค์ประกอบทั้งหมด i เป็น nums −
- x :=x XOR ฉัน
- ผลตอบแทน x เหมือนกับ 0 หรือ n mod 2 คือ 0
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: bool xorGame(vector<int>& nums) { int n = nums.size(); int x = 0; for(int i : nums) x ^= i; return x == 0 || n % 2 == 0; } }; main(){ Solution ob; vector<int> v = {1,2,1}; cout << (ob.xorGame(v)); }
อินพุต
{1,2,1}
ผลลัพธ์
0