จำนวนเดี่ยวและคุณสมบัติของ XOR
ใช้คุณสมบัติการเป็นอินเวอร์สของตัวเองของ XOR เพื่อค้นหาสมาชิกหนึ่งตัวที่ปรากฏครั้งเดียวในรายการซึ่งสมาชิกอื่นปรากฏสองครั้ง แล้วต่อยอดไปยังปัญหาจำนวนเดี่ยว II และ III
จำนวนเดี่ยวและคุณสมบัติของ XOR เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
ปัญหาจำนวนที่ปรากฏเพียงครั้งเดียว
ปัญหา จำนวนที่ปรากฏเพียงครั้งเดียว (LeetCode 136) ถามว่า: เมื่อกำหนดอาร์เรย์ที่องค์ประกอบทุกตัวปรากฏ בדיוקสองครั้ง ยกเว้นหนึ่งตัว จงหาองค์ประกอบที่ปรากฏเพียงครั้งเดียว ข้อจำกัดด้านเวลา O(n) และพื้นที่ O(1) ทำให้ไม่สามารถใช้ตารางแฮช (พื้นที่ O(n)) และการเรียงลำดับ (เวลา O(n log n) หรือพื้นที่ O(n) สำหรับการเรียงลำดับ) ได้
วิธีแก้ที่สง่างามใช้ XOR โดยทำ XOR กับองค์ประกอบทุกตัว เนื่องจากองค์ประกอบที่เหมือนกันจะหักล้างกัน (a ^ a = 0) และ XOR มีสมบัติสลับที่และสมบัติการเปลี่ยนหมู่ องค์ประกอบที่เป็นคู่ทั้งหมดจึงหายไป เหลือเพียงองค์ประกอบเดี่ยวเท่านั้น นี่เป็นหนึ่งในวิธีแก้ปัญหา O(n)/O(1) ที่น่าพึงพอใจที่สุดในการเขียนโปรแกรมแข่งขัน
def single_number(nums):
result = 0
for n in nums:
result ^= n
return result
# All pairs cancel, leaving the lone element
print(single_number([2, 2, 1])) # 1
print(single_number([4, 1, 2, 1, 2])) # 4
print(single_number([1])) # 1
print(single_number([7, 3, 5, 3, 7])) # 5
# Even more concise with functools.reduce
from functools import reduce
from operator import xor
print(reduce(xor, [2, 2, 1])) # 1เหตุผลที่ XOR ใช้งานได้: สมบัติสำคัญสามประการ
พลังของ XOR มาจากสมบัติทางพีชคณิตสามประการที่ทำงานร่วมกัน:
- ผกผันตัวเอง:
a ^ a = 0— ค่าที่เหมือนกันจะหักล้างกันเอง - เอกลักษณ์:
a ^ 0 = a— การทำ XOR กับศูนย์ไม่เปลี่ยนแปลงค่า - สมบัติสลับที่และสมบัติการเปลี่ยนหมู่: ลำดับไม่สำคัญ และการจัดกลุ่มก็ไม่สำคัญ
สมบัติทั้งสามนี้ทำให้การทำ XOR กับมัลติเซตลดองค์ประกอบทั้งหมดที่ปรากฏเป็นจำนวนคู่ให้เหลือ 0 และเหลือเฉพาะองค์ประกอบที่ปรากฏเป็นจำนวนคี่ สำหรับจำนวนเดียว I มีองค์ประกอบหนึ่งตัวปรากฏหนึ่งครั้ง ซึ่งเป็นจำนวนคี่ ดังนั้นองค์ประกอบนั้นจึงเป็นผลลัพธ์ของ XOR
# Demonstrating the three XOR properties
print('Self-inverse: a ^ a = 0')
for a in [5, 13, 255, 0]:
print(f' {a} ^ {a} = {a ^ a}')
print('Identity: a ^ 0 = a')
for a in [5, 13, 0, 1024]:
print(f' {a} ^ 0 = {a ^ 0}')
print('Commutativity and Associativity:')
a, b, c = 3, 5, 7
print(f' a^b^c = {a^b^c}')
print(f' c^a^b = {c^a^b}') # same result
print(f' (a^b)^c = {(a^b)^c}')
print(f' a^(b^c) = {a^(b^c)}') # same resultติดตามการทำงานของจำนวนที่ปรากฏเพียงครั้งเดียว
ลองติดตาม [4, 1, 2, 1, 2] ทีละขั้นเพื่อดูการหักล้างที่เกิดขึ้น เราทำ XOR กับองค์ประกอบทั้งหมด: 4 ^ 1 ^ 2 ^ 1 ^ 2 เนื่องจาก XOR มีสมบัติสลับที่ จึงจัดลำดับใหม่เป็น (1 ^ 1) ^ (2 ^ 2) ^ 4 = 0 ^ 0 ^ 4 = 4 คู่ที่เหมือนกันจะหักล้างกัน เหลือเพียง 4
ในอัลกอริทึมจริง เราไม่ได้จัดลำดับใหม่ แต่ทำ XOR จากซ้ายไปขวา อย่างไรก็ตาม ผลลัพธ์สุดท้ายเหมือนเดิม เพราะสมบัติสลับที่และสมบัติการเปลี่ยนหมู่รับประกันว่าลำดับไม่มีผลต่อผลลัพธ์ คุณสามารถจัดกลุ่มคู่ที่เหมือนกันในใจไว้ที่ใดก็ได้ และคู่เหล่านั้นจะหักล้างกันทั้งหมด
nums = [4, 1, 2, 1, 2]
result = 0
print(f'Start: result = {result} ({bin(result)})')
for n in nums:
prev = result
result ^= n
print(f'XOR {n:2d}: {bin(prev):8s} ^ {bin(n):6s} = {bin(result):8s} = {result}')
print(f'Final: {result}') # 4
# Alternative: show pair cancellation
print('\nMath view:')
print('4 ^ 1 ^ 2 ^ 1 ^ 2')
print('= 4 ^ (1^1) ^ (2^2)')
print('= 4 ^ 0 ^ 0')
print('= 4')จำนวนเดียว II: องค์ประกอบทุกตัวปรากฏสามครั้ง
จำนวนเดียว II (LeetCode 137): องค์ประกอบทุกตัวปรากฏสามครั้ง ยกเว้นหนึ่งตัวที่ปรากฏครั้งเดียว การใช้ XOR เพียงอย่างเดียวใช้ไม่ได้ เพราะองค์ประกอบที่เป็นคู่จะไม่หักล้างกันเมื่อปรากฏสามครั้ง แต่ให้เรานับว่าแต่ละบิตปรากฏกี่ครั้งในตัวเลขทั้งหมด หากบิตหนึ่งอยู่ในองค์ประกอบเป้าหมาย บิตนั้นจะมีส่วนเป็น 1 ส่วนในองค์ประกอบที่ปรากฏสามครั้งจะมีส่วนเป็น 3 จากนั้นนำจำนวนครั้งมาหารเอาเศษด้วย 3 สำหรับแต่ละบิต เพื่อแยกบิตขององค์ประกอบเป้าหมายออกมา
เราจำลองวิธีนี้ได้ด้วยตัวแปรจำนวนเต็มสองตัวคือ ones และ twos ซึ่งทำหน้าที่เป็นตัวนับระดับบิตแบบโมดูโล 3 นี่เป็นแนวทางด้านตรรกะดิจิทัล โดย ones เก็บบิตที่พบเป็นจำนวนคี่เมื่อคิดแบบโมดูโล 2 และ twos เก็บบิตที่พบสองครั้งเมื่อคิดแบบโมดูโล 3
def single_number_II(nums):
ones, twos = 0, 0
for n in nums:
ones = (ones ^ n) & ~twos # bits seen 1 mod 3 times
twos = (twos ^ n) & ~ones # bits seen 2 mod 3 times
return ones # bits seen exactly once
print(single_number_II([2, 2, 3, 2])) # 3
print(single_number_II([0, 1, 0, 1, 0, 1, 99])) # 99
# Simpler but O(32) bit-by-bit approach
def single_number_II_simple(nums):
result = 0
for bit in range(32):
total = sum((n >> bit) & 1 for n in nums)
if total % 3 == 1:
result |= (1 << bit)
return result
print(single_number_II_simple([2, 2, 3, 2])) # 3จำนวนเดียว III: องค์ประกอบสองตัวปรากฏครั้งเดียว
จำนวนเดียว III (LeetCode 260): มีองค์ประกอบสองตัวที่แต่ละตัวปรากฏครั้งเดียว ส่วนองค์ประกอบอื่นทั้งหมดปรากฏสองครั้ง ให้ทำ XOR กับองค์ประกอบทั้งหมดเพื่อได้ a ^ b (ค่า XOR ขององค์ประกอบที่ไม่ซ้ำกันสองตัว) เนื่องจาก a ≠ b อย่างน้อยหนึ่งบิตใน a ^ b จึงมีค่าเป็น 1 ให้หาบิตที่มีค่าเป็น 1 ต่ำสุดของ a ^ b โดยใช้ diff = xor_all & (-xor_all)
บิตนี้มีค่าเป็น 1 ใน a หรือ b เพียงตัวเดียว ให้แบ่งตัวเลขทั้งหมดออกเป็นสองกลุ่มตามว่าบิตนี้ถูกตั้งค่าไว้หรือไม่ จากนั้นทำ XOR แยกกันในแต่ละกลุ่ม องค์ประกอบที่เป็นคู่จะหักล้างกัน เหลือ a จากกลุ่มหนึ่งและ b จากอีกกลุ่มหนึ่ง
def single_number_III(nums):
xor_all = 0
for n in nums:
xor_all ^= n # xor_all = a ^ b
diff = xor_all & (-xor_all) # isolate lowest differing bit
a = 0
for n in nums:
if n & diff: # group 1: has the diff bit set
a ^= n
b = xor_all ^ a # a ^ b ^ a = b
return [a, b]
print(sorted(single_number_III([1, 2, 1, 3, 2, 5]))) # [3, 5]
print(sorted(single_number_III([-1, 0]))) # [-1, 0]
print(sorted(single_number_III([0, 1]))) # [0, 1]หาจำนวนที่หายไปด้วย XOR
ปัญหาจำนวนที่หายไป (LeetCode 268): เมื่อกำหนดอาร์เรย์ที่มีจำนวนแตกต่างกัน n ตัวจาก 0 ถึง n จงหาจำนวนที่หายไป ให้ทำ XOR กับตัวเลขทั้งหมดในอาร์เรย์และตัวเลขทั้งหมดตั้งแต่ 0 ถึง n คู่ที่เหมือนกันจะหักล้างกัน เหลือจำนวนที่หายไป วิธีนี้ใช้เวลา O(n) และพื้นที่ O(1)
อีกวิธีหนึ่งคือใช้สูตรผลรวมทางคณิตศาสตร์: expected = n*(n+1)//2 แล้วลบด้วยผลรวมจริง ทั้งสองวิธีใช้เวลา O(n) และพื้นที่ O(1) การใช้ XOR มีความทนทานมากกว่า เพราะหลีกเลี่ยงโอกาสที่จำนวนเต็มจะล้นในภาษาที่ใช้จำนวนเต็มความกว้างคงที่
def missing_number_xor(nums):
n = len(nums)
result = n # start with n (the last expected value)
for i, num in enumerate(nums):
result ^= i ^ num # XOR with both index and value
return result
def missing_number_sum(nums):
n = len(nums)
expected = n * (n + 1) // 2
return expected - sum(nums)
for nums, expected in [([3,0,1], 2), ([0,1], 2), ([9,6,4,2,3,5,7,0,1], 8)]:
xor_ans = missing_number_xor(nums)
sum_ans = missing_number_sum(nums)
print(f'nums={nums}: XOR={xor_ans}, Sum={sum_ans}, expected={expected}')ใช้ XOR สลับค่าโดยไม่ใช้ตัวแปรชั่วคราว
XOR ช่วยให้สลับค่าตัวแปรสองตัวได้โดยไม่ต้องใช้ตัวแปรชั่วคราว เคล็ดลับคือ a ^ b ^ a = b และ a ^ b ^ b = a ให้กำหนดค่าด้วย XOR สามครั้งตามลำดับ: a ^= b จากนั้น b ^= a แล้วจึง a ^= b เมื่อทำครบทั้งสามครั้ง a จะเก็บค่าเดิมของ b และ b จะเก็บค่าเดิมของ a
ข้อควรระวังที่สำคัญ: เคล็ดลับนี้ใช้ไม่ได้หาก a และ b อ้างอิงตำแหน่งหน่วยความจำเดียวกัน (กล่าวคือ เป็นตัวแปรเดียวกัน) ในกรณีนั้น a ^= a จะกำหนดให้ a เป็น 0 และทำให้ค่าสูญหาย ในไพทอน การแยกค่าแบบทูเพิล (a, b = b, a) ปลอดภัยและอ่านเข้าใจได้มากกว่า การสลับด้วย XOR มีประโยชน์หลักในบริบท C/ระบบฝังตัวที่ไม่ต้องการใช้หน่วยความจำเพิ่มเติม
# XOR swap
a, b = 17, 42
print(f'Before: a={a}, b={b}')
a ^= b # a = 17 ^ 42
b ^= a # b = 42 ^ (17 ^ 42) = 17
a ^= b # a = (17 ^ 42) ^ 17 = 42
print(f'After: a={a}, b={b}') # a=42, b=17
# The caveat: same variable/reference => broken
c = 99
# If a and b pointed to same value:
c ^= c # c = 0 (destroyed!)
print(f'Same-variable XOR swap: c={c}') # 0, not 99
# Pythonic swap: always prefer this
a, b = 17, 42
a, b = b, a # safe, clear, handles aliases
print(f'Pythonic: a={a}, b={b}')XOR ในการทำแฮชและผลรวมตรวจสอบ
XOR เป็นองค์ประกอบพื้นฐานที่ใช้กันทั่วไปในผลรวมตรวจสอบและการตรวจสอบพาริตี การทำ XOR กับไบต์ทั้งหมดในบล็อกข้อมูลจะสร้างผลรวมตรวจสอบขนาดหนึ่งไบต์ หากมีบิตหนึ่งเปลี่ยนค่าระหว่างการส่งข้อมูล ผลรวมตรวจสอบจะเปลี่ยนไปและตรวจพบข้อผิดพลาดได้ วิธีนี้ง่ายกว่า CRC แต่ตรวจจับข้อผิดพลาดที่เกิดจากการเปลี่ยนบิตเดียวได้ทั้งหมด
XOR ยังใช้ในพาริตีของ RAID-5 ด้วย: สำหรับไดรฟ์สามตัว ให้เก็บค่า XOR ของข้อมูลจากไดรฟ์สองตัวไว้ในไดรฟ์ที่สาม หากไดรฟ์หนึ่งตัวเสีย ให้ทำ XOR กับไดรฟ์ที่เหลืออีกสองตัวเพื่อสร้างข้อมูลที่สูญหายขึ้นใหม่ นี่คือแนวคิดเดียวกับจำนวนที่ปรากฏเพียงครั้งเดียวในทางกลับกัน — ไดรฟ์พาริตีคือ 'องค์ประกอบเดี่ยว' ที่เข้ารหัสสิ่งที่ถูกหักล้างเมื่อทำ XOR กับไดรฟ์ทั้งสามตัว
# Simple XOR checksum
def xor_checksum(data):
result = 0
for byte in data:
result ^= byte
return result
data = [0x48, 0x65, 0x6C, 0x6C, 0x6F] # 'Hello' in ASCII
checksum = xor_checksum(data)
print(f'Checksum: {hex(checksum)}')
# Detect corruption
corrupted = data[:]
corrupted[2] ^= 0xFF # flip all bits of 3rd byte
new_checksum = xor_checksum(corrupted)
print(f'Original checksum: {hex(checksum)}')
print(f'Corrupted checksum: {hex(new_checksum)}')
print(f'Error detected: {checksum != new_checksum}')
# RAID-5 parity recovery
d1 = [1, 0, 1, 1]
d2 = [0, 1, 1, 0]
parity = [d1[i] ^ d2[i] for i in range(4)]
recovered = [parity[i] ^ d2[i] for i in range(4)] # recover d1
print(f'd1={d1}, parity={parity}, recovered={recovered}')XOR กับปัญหาเซตย่อย
XOR ปรากฏในปัญหาเซตย่อยเมื่อคุณต้องคำนวณค่า XOR ของเซตย่อยทั้งหมด ข้อสังเกตสำคัญคือ สำหรับองค์ประกอบ n ตัว แต่ละองค์ประกอบจะปรากฏในเซตย่อยจำนวน 2^(n-1) เซตพอดี หาก n > 1 องค์ประกอบทุกตัวจะปรากฏในเซตย่อยเป็นจำนวนคู่ ดังนั้นส่วนร่วมขององค์ประกอบแต่ละตัวในการทำ XOR จะหักล้างกัน ค่า XOR ของค่า XOR จากเซตย่อยทั้งหมดจึงเป็น 0 เมื่อ n > 1
เมื่อ n == 1 เซตย่อยที่ไม่ว่างเพียงเซตเดียวคือองค์ประกอบนั้นเอง ดังนั้นค่า XOR ของเซตย่อยทั้งหมดจึงเป็นองค์ประกอบนั้น การใช้เหตุผลในลักษณะนี้ — อาศัยสมบัติของ XOR และการนับ — มักใช้ทดสอบในปัญหาการจัดการบิตระดับสูง
from itertools import combinations
from functools import reduce
from operator import xor
def xor_of_all_subsets(arr):
n = len(arr)
total_xor = 0
for r in range(1, n + 1):
for subset in combinations(arr, r):
subset_xor = reduce(xor, subset)
total_xor ^= subset_xor
return total_xor
# For n > 1, each element appears 2^(n-1) times (even) => cancels
# Result is always 0 for n > 1
for arr in [[1,2,3], [5,7], [1], [1,2,3,4]]:
result = xor_of_all_subsets(arr)
predicted = arr[0] if len(arr) == 1 else 0
print(f'arr={arr}: XOR of all subsets = {result}, predicted = {predicted}')รูปแบบในการสัมภาษณ์: ใช้ XOR เพื่อหาความไม่ซ้ำกัน
ให้สังเกตรูปแบบการใช้ XOR เพื่อหาความไม่ซ้ำกันเมื่อโจทย์ระบุว่า: 'องค์ประกอบทุกตัวปรากฏ k ครั้ง ยกเว้นหนึ่งตัวที่ปรากฏ m ครั้ง โดยที่ m mod k != 0' สำหรับ k=2, m=1 (จำนวนเดียว I): ทำ XOR กับองค์ประกอบทั้งหมด สำหรับ k=3, m=1 (จำนวนเดียว II): นับบิตแล้วหารเอาเศษด้วย 3 สำหรับ k=2, m=1 ที่มีองค์ประกอบไม่ซ้ำกันสองตัว (จำนวนเดียว III): ทำ XOR แล้วแบ่งตามบิตที่แตกต่างกันต่ำสุด
แนวทางทั่วไปสำหรับ k ใด ๆ คือ นับจำนวนการปรากฏรวมของแต่ละบิต แล้วหารเอาเศษด้วย k หากผลการนับไม่เป็นศูนย์ บิตนั้นเป็นขององค์ประกอบที่ไม่ซ้ำกัน วิธีนี้ให้อัลกอริทึม O(32n) = O(n) และใช้พื้นที่ O(1) สำหรับ k ใด ๆ
def single_number_k_times(nums, k):
'''Find the element that appears m times when all others appear k times.'''
# Count each bit's occurrence and take mod k
result = 0
for bit in range(32):
total = sum((n >> bit) & 1 for n in nums)
if total % k != 0:
result |= (1 << bit)
# Handle negative 32-bit numbers
if result >= (1 << 31):
result -= (1 << 32)
return result
# k=2, element appears once
print(single_number_k_times([2,2,1], 2)) # 1
# k=3, element appears once
print(single_number_k_times([2,2,3,2], 3)) # 3
# k=4, element appears once
print(single_number_k_times([1,1,1,1,7,2,2,2,2], 4)) # 7ปัญหา XOR ที่พบบ่อยในการสัมภาษณ์
นอกเหนือจากกลุ่มปัญหาจำนวนเดียวแล้ว XOR ยังปรากฏในปัญหาที่มักถูกถามเหล่านี้:
- หาความแตกต่าง (LC 389): ทำ XOR กับอักขระทั้งหมดของสตริงทั้งสอง อักขระที่เกินมาจะยังคงอยู่
- ระยะฮัมมิง (LC 461): ทำ XOR กับตัวเลขสองตัว แล้วนับบิตที่มีค่าเป็น 1 ในผลลัพธ์
- ระยะฮัมมิงรวม (LC 477): นับจำนวน 0 และ 1 ในแต่ละตำแหน่งบิตของทุกคู่
- การสอบถามค่า XOR ของอาร์เรย์ย่อย (LC 1310): ใช้อาร์เรย์ XOR สะสมสำหรับการสอบถามตามช่วง
ในแต่ละกรณี สมบัติการหักล้างของ XOR จะกำจัดความซ้ำซ้อนและลดวิธีการลองทุกกรณีที่ใช้เวลา O(n²) ให้เหลือ O(n)
# Find the difference between two strings
def find_the_difference(s, t):
result = 0
for c in s + t:
result ^= ord(c)
return chr(result)
print(find_the_difference('abcd', 'abcde')) # 'e'
# Hamming distance: count differing bits
def hamming_distance(x, y):
diff = x ^ y
count = 0
while diff:
count += diff & 1
diff >>= 1
return count
# or: bin(x ^ y).count('1')
print(hamming_distance(1, 4)) # 2: 001 vs 100 differ in bits 0 and 2
print(hamming_distance(3, 1)) # 1: 011 vs 001 differ in bit 1
# Prefix XOR for range queries
def xor_queries(arr, queries):
prefix = [0] * (len(arr) + 1)
for i, v in enumerate(arr):
prefix[i+1] = prefix[i] ^ v
return [prefix[r+1] ^ prefix[l] for l, r in queries]
print(xor_queries([1,3,4,8], [[0,1],[1,2],[0,3],[3,3]]))ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจแนวคิดโครงสร้างข้อมูลและอัลกอริทึม — การเตรียมตัวสัมภาษณ์ด้านการเขียนโปรแกรมจากบทเรียนนี้
ทบทวนบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า: สมบัติผกผันตัวเองของ XOR (a ^ a = 0) ทำให้องค์ประกอบที่เป็นคู่หักล้างกัน เหลือเพียงองค์ประกอบที่ไม่ซ้ำกันเมื่อทำ XOR กับตัวเลขทั้งหมดเข้าด้วยกัน, จำนวนเดียว II ใช้การนับบิตโดยหารเอาเศษด้วย 3 ส่วนจำนวนเดียว III แบ่งองค์ประกอบตามบิตที่แตกต่างกันต่ำสุด และ XOR ยังใช้แก้ปัญหาจำนวนที่หายไป การหาความแตกต่าง ระยะฮัมมิง และการสอบถามค่า XOR ตามช่วงได้ บทถัดไปเราจะสำรวจมาสก์บิตสำหรับการตั้งบิต การล้างบิต การสลับบิต และการตรวจสอบบิตแต่ละตัว
คำถามที่พบบ่อย
บทเรียน “จำนวนเดี่ยวและคุณสมบัติของ XOR” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “จำนวนเดี่ยวและคุณสมบัติของ XOR” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “จำนวนเดี่ยวและคุณสมบัติของ XOR”
ใช้คุณสมบัติการเป็นอินเวอร์สของตัวเองของ XOR เพื่อค้นหาสมาชิกหนึ่งตัวที่ปรากฏครั้งเดียวในรายการซึ่งสมาชิกอื่นปรากฏสองครั้ง แล้วต่อยอดไปยังปัญหาจำนวนเดี่ยว II และ III คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “จำนวนเดี่ยวและคุณสมบัติของ XOR” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ตัวดำเนินการระดับบิต: AND, OR, XOR, NOT และการเลื่อนบิต
- จำนวนเดี่ยวและคุณสมบัติของ XOR
- บิตมาสก์: ตั้งค่า ล้าง สลับ และตรวจสอบ
- การนับบิต จำนวนที่หายไป และการกลับบิต