0Pricing
Coding Interview Prep · บทเรียน

จำนวนเดี่ยวและคุณสมบัติของ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ตัวดำเนินการระดับบิต: AND, OR, XOR, NOT และการเลื่อนบิต
  2. จำนวนเดี่ยวและคุณสมบัติของ XOR
  3. บิตมาสก์: ตั้งค่า ล้าง สลับ และตรวจสอบ
  4. การนับบิต จำนวนที่หายไป และการกลับบิต
← กลับไปที่ Coding Interview Prep