Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình để tìm ra các giá trị XOR của các phần tử cụ thể từ danh sách được tạo bằng Python

Giả sử chúng ta được đưa ra một danh sách có chứa các số tự nhiên. Bây giờ từ danh sách đó, chúng tôi loại bỏ tất cả các số có chứa hai số 1 liên tiếp trong biểu diễn nhị phân của nó và tạo một danh sách khác được gọi là Z. Bây giờ chúng tôi được cung cấp một danh sách khác 'input_list' chứa một số giá trị số nguyên. Chúng ta phải tìm ra giá trị XOR của các phần tử được chỉ định từ Z có chỉ mục được chỉ định trong input_list.

Vì vậy, nếu đầu vào là input_list =[3, 4, 5], thì đầu ra sẽ là 9.

Trong chỉ mục 3, 4 và 5 của Z; các giá trị là 4, 5 và 8. Vì vậy, 4 XOR 5 XOR 8 =9.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Định nghĩa một hàm zeck_num (). Điều này sẽ mất k, f_list
    • res:=0
    • đối với tôi trong phạm vi (kích thước của f_list -1) đến -1, giảm đi 1, thực hiện
      • nếu k> =f_list [i], thì
        • res:=res + 2 ^ i
        • k:=k - f_list [i]
    • trả lại res
  • MOD:=10 ^ 9 + 7
  • max_val:=10 ^ 18
  • f_list:=một danh sách mới chứa các giá trị 1 và 2
  • while phần tử cuối cùng của f_list <=max_val, thực hiện
    • chèn phần tử cuối cùng của f_list + phần tử cuối cùng thứ hai của f_list vào cuối f_list
  • res:=0
  • đối với mỗi chỉ mục trong input_list, hãy thực hiện
    • res:=res XOR zeck_num (index, f_list)
  • trả lại bản sửa đổi độ phân giải MOD

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

def zeck_num(k, f_list):
   res = 0
   for i in range(len(f_list)-1,-1,-1):
      if k >= f_list[i]:
         res += 2**i
         k -= f_list[i]
   return res

def solve(input_list):
   MOD = 10**9+7
   max_val = 10**18
   f_list = [1,2]
   while f_list[-1] <= max_val:
      f_list.append(f_list[-1] + f_list[-2])
   res = 0
   for index in input_list:
      res ^= zeck_num(index, f_list)
   return res % MOD

print(solve([3, 4, 5]))

Đầu vào

[3, 4, 5]

Đầu ra

9