Во-первых, для того, чтобы свопы делали списки равными, они должны начинаться с одинакового количества единиц и нулей. Таким образом, мы можем использовать Counter
для проверки на невозможность.
И, во-вторых, один своп обязательно исправляет два различия. Таким образом, мы можем просто подсчитать разницу и разделить на 2. На самом деле нам не нужно выполнять какие-либо обмены.
Демонстрация:
from collections import Counter
def swap_count(xs, ys):
if xs == ys:
return 0
else:
cx = Counter(xs)
cy = Counter(ys)
if cx == cy:
n_diffs = sum(x != y for x, y in zip(xs, ys))
return n_diffs // 2
else:
return -1
def main():
tests = [
(2, [0, 1, 0, 1], [1, 0, 1, 0]),
(1, [0, 1, 0], [1, 0, 0]),
(-1, [0], [1]),
(0, [0, 1, 0, 1], [0, 1, 0, 1]),
]
for exp, xs, ys in tests:
n = swap_count(xs, ys)
print(n == exp, n, xs, ys)
main()
Вывод:
True 2 [0, 1, 0, 1] [1, 0, 1, 0]
True 1 [0, 1, 0] [1, 0, 0]
True -1 [0] [1]
True 0 [0, 1, 0, 1] [0, 1, 0, 1]