Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

หา X ให้ XOR ทุกตัวในอาร์เรย์รวมได้น้อยที่สุดใน Python

ภาพรวม

โจทย์หาตัวเลข X ที่ทำให้ผลรวม (A[i] XOR X) น้อยที่สุด

ตัวอย่าง

A = [3, 4, 5, 6, 7]

X = 7 → ผลรวม = (3⊕7)+(4⊕7)+(5⊕7)+(6⊕7)+(7⊕7) = 4+3+2+1+0 = 10

หลักการ: Bitwise Majority

พิจารณาแต่ละบิตแยกกัน สำหรับบิต i:

  • นับจำนวน 1 ในบิต i ของทุก A[j] → cnt
  • ถ้า cnt > n/2 → ตั้งบิต i ของ X = 1 (เพื่อให้ XOR กลายเป็น 0 ส่วนใหญ่)
  • ถ้า cnt ≤ n/2 → ตั้งบิต i ของ X = 0

เพราะ 1⊕1=0, 0⊕0=0, 1⊕0=1, 0⊕1=1 → ต้องการให้ XOR 0 ส่วนใหญ่

โค้ด Python

from math import log2

def search_res(arr, n):
    element = max(arr)
    p = int(log2(element)) + 1
    X = 0
    for i in range(p):
        cnt = 0
        for j in range(n):
            if arr[j] & (1 << i):
                cnt += 1
        if cnt > n // 2:
            X += 1 << i
    total = sum(X ^ val for val in arr)
    print("X =", X, ", Sum =", total)

arr = [3, 4, 5, 6, 7]
n = len(arr)
search_res(arr, n)

ผลลัพธ์

X = 7 , Sum = 10