Định nghĩa một hàm có tên là list_xor
. Hàm của bạn phải có ba tham số. n
,
>>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
0 và >>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
1Hàm của bạn phải trả về cho dù n
chỉ có trong
>>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
0 hay >>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
1Nói cách khác, nếu n
có trong cả hai danh sách hoặc không có danh sách nào, hãy trả về
>>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
6. Nếu n
chỉ nằm trong một trong các danh sách, hãy trả về list_xor
1 Vì kích thước đầu vào là
>>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
9 và bạn đang sử dụng Python 2, vấn đề đầu tiên là bạn đang tạo một danh sách các số nguyên 10**6 không cần thiết chỉ để thực hiện một vòng lặpThay vào đó, bạn nên sử dụng
>>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
0 để tạo ra số nguyên một cách lười biếng>>> %timeit for _ in range[10**6]: pass
10 loops, best of 3: 24.1 ms per loop
>>> %timeit for _ in xrange[10**6]: pass
f100 loops, best of 3: 8.92 ms per loop
Một tối ưu hóa vi mô nhỏ khác mà bạn có thể thực hiện ở đây là sử dụng
>>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
1 với >>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
2. >>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
2 là một singleton, vì vậy, chỉ có một >>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
2 duy nhất tồn tại trong bộ nhớ và nó là đối tượng nhỏ nhất trong CPython, mặt khác, việc tạo ra 10**6 số nguyên rất tốn kém [CPython cũng lưu trữ một số trong số chúng, nhưng chúng vẫn không cần thiết ở đây]>>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
Vì chúng tôi đang sử dụng các hàm như
>>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
2, >>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
3 nhiều lần trong mã của mình, tốt hơn hết là lưu trữ chúng dưới dạng biến cục bộ, vì nếu không, chúng tôi sẽ tìm kiếm chúng ít nhất >>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
9 lần trong từ điển chung. Một cách để lưu chúng vào bộ đệm là sử dụng chúng làm giá trị mặc định cho các thuộc tính chức năng>>> def f_simple[n]:
for _ in xrange[n]:
foo = [int['1'] for _ in xrange[15]]
..
>>> def f_cached[n, int=int]:
for _ in xrange[n]:
foo = [int['1'] for _ in xrange[15]]
..
>>> %timeit f_simple[10**6]
1 loops, best of 3: 3.7 s per loop
>>> %timeit f_cached[10**6]
1 loops, best of 3: 3.52 s per loop
Thay vì bắt đầu giá trị kết quả bằng
>>> %timeit for _ in repeat[None, 10**6]: pass
100 loops, best of 3: 7 ms per loop
5, chúng ta chỉ cần bắt đầu bằng 0 và chúng ta cũng có thể ngăn việc tạo danh sách 15 mục đơn giản đóresult = 0
for x in raw_input[].split[]:
result ^= int[x]
Hiện tại giải pháp đầu tiên của bạn mất khoảng 7. 44 giây trên hệ thống của tôi và giải pháp của tôi mất khoảng 5. 6 giây, không phải là một cải tiến lớn
from itertools import islice
from functools import partial
import sys
def main5[int=int]:
t = int[raw_input[]]
# Take a slice of sys.stdin of size [10**6]*2
lines = islice[sys.stdin, t*2]
# Now lines is an iterator which is going to yield one
# line at a time, but we're also going to read the next line[to get X]
# with each input, so instead of doing `next[lines]` each time in
# the loop we can create a partial function.
next_line = partial[next, lines]
for line in lines:
result = 0
for x in line.split[]:
result ^= int[x]
if format[result, 'b'].zfill[32].count['1'] > int[next_line[]]:
print 'YES'
else:
print 'NO'
Lưu ý rằng trong giải pháp trên, chúng tôi đang ghi vào thiết bị xuất chuẩn ngay lập tức, nếu chúng tôi có thể lưu trữ tạm thời đầu ra trong một danh sách [giả sử 1000 mục] và chúng ghi chúng cùng một lúc thì giải pháp trên mất 5. 52 giây
Ngôn ngữ nhị phân là ngôn ngữ của máy tính. Tất cả các cơ chế bên trong của máy tính xảy ra liên quan đến các bit. Các toán tử theo bit là tập hợp các toán tử cho phép lập trình viên thực hiện các phép toán theo bit trên các số nguyên. Các toán tử này cho phép lập trình viên thao tác dữ liệu cấp thấp hơn trong máy tính. Có tổng cộng sáu toán tử bitwise trong Python
- Bitwise AND
- Bitwise HOẶC
- Bitwise KHÔNG
- Bitwise XOR
- Dịch chuyển phải theo chiều bit
- Dịch chuyển trái theo chiều bit
Bài viết này thảo luận về toán tử Bitwise XOR với các ví dụ
- Khi chúng tôi áp dụng toán tử bitwise trên hai toán hạng, các giá trị số nguyên được chuyển đổi thành dạng nhị phân của chúng - thành bit
- Sau đó, toán tử thực hiện thao tác từng bit trên từng bit riêng lẻ
- Sau khi hoạt động, số nhị phân được chuyển đổi thành dạng thập phân và được trả về dưới dạng đầu ra
Bây giờ, hãy để chúng tôi hiểu hoạt động của Bitwise XOR
- Nó được gọi là "Độc quyền HOẶC". Nó loại trừ 1. 1 -> 1 điều kiện từ 'hoặc'
- Nó là một toán tử nhị phân - được thực hiện giữa hai toán hạng
- đại diện. a ^ b trong đó 'a' và 'b' là hai toán hạng
- Giá trị trả về. Nó trả về một số nguyên khi được thực hiện giữa hai số nguyên và một giá trị Boolean khi được thực hiện giữa hai giá trị Boolean
Hoạt động
- Hai số nguyên đã cho được chuyển đổi thành dạng nhị phân
- Trong hai ký hiệu nhị phân
- Nếu cả hai bit tương ứng giống nhau - [1^1], [0^0], nó trả về 0
- Nếu cả hai bit tương ứng khác nhau - [1^0], [0^1], nó trả về 1
Bảng chân trị của XOR
Bit 1 [toán hạng 1]Bit 2 [toán hạng 2]Giá trị trả về110000101011Hãy để chúng tôi hiểu khái niệm bằng cách sử dụng một ví dụ
Nếu chúng ta muốn thực hiện
3^4
1. Cả hai số nguyên được chuyển đổi thành dạng nhị phân
3 -> 0 1 1
4 -> 1 0 0
2. Bây giờ, xor được áp dụng theo chiều bit
3. Cuối cùng, số nhị phân kết quả được chuyển đổi trở lại dạng thập phân của nó
1 1 1 đại diện cho 7
4. Đầu ra -> 7
3^4 -> 7
Bây giờ, với cùng toán hạng, chúng ta hãy viết mã cho xor
đầu ra
Trên các giá trị Boolean
Chúng ta có thể thực hiện xor trên các giá trị Boolean. Khi chúng ta thao tác trên hai số nguyên, 1 tương đương với Boolean True và 0 tương đương với Boolean False