我正在嘗試撰寫一個程式,其中輸入是具有任意長度的二進制字串以及所需的位翻轉次數,輸出是具有指定位翻轉次數的所有可能字串(在串列中) . 例如,如果輸入是'110'和2,則輸出是['000','101','011']。我是 python 新手,沒有找到任何類似的程式。我真的不知道我該怎么做。誰能給我一些提示?非常感謝您的幫助!!
uj5u.com熱心網友回復:
您可以使用組合演算法來生成所有可能的情況。
from itertools import combinations
input_bits = '110'
flip_count = 2
# get all available flip positions
flip_positions = [_ for _ in range(len(input_bits))]
combs = combinations(flip_positions, flip_count)
# flip given bit string
def flip(bit_str, comb):
bit_arr = [_ for _ in bit_str]
for i in comb:
if bit_arr[i] == '0':
bit_arr[i] = '1'
else:
bit_arr[i] = '0'
return ''.join(bit_arr)
# implement combination
for comb in list(combs):
flipped = flip(input_bits, comb)
print(flipped)
uj5u.com熱心網友回復:
Ice Griffin 答案的整數異或版本。
from itertools import combinations
input_bits = '110'
flip_count = 2
# get all available single bit flips
flips = [1 << i for i in range(len(input_bits))]
combs = combinations(flips, flip_count)
# flip given bit string
def flip(bit_str, comb):
n = int(bit_str, 2) ^ sum(comb)
return f'{n:0{len(bit_str)}b}'
# implement combination
for comb in list(combs):
flipped = flip(input_bits, comb)
print(flipped)
uj5u.com熱心網友回復:
您可以直接迭代所有可能的 2**n 數字并找到您要查找的內容,而無需使用任何庫函式。
s, k = map(str,input().split())
k = int(k)
n = len(s)
ans = []
for i in range(2**n):
num = bin(i)[2:]
num = "0" * (n - len(num)) num
if(num.count("1") == k):
# Flip s at on positions of num
res = ""
for j in range(n):
if(num[j] == "1"):
res = str(1 - int(s[j]))
else:
res = s[j]
ans.append(res)
print(*ans)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/404650.html
標籤:
上一篇:在R中使用scan()函式在下劃線處拆分字串-strsplit()與scan()比較
下一篇:有沒有更好的方法來清潔字串?
