之前遇到过一个完美洗牌问题
有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn}
我也知道根据代数理论,置换环什么玩意儿的可以通过置换得到
但是这可是面试题哎,难道不是面试程序员是面试近视代数知识么。。。。
def perfectShuffle(input_list, start_index, end_index):
length = end_index - start_index + 1
temp = None
if length % 2 != 0:
raise Exception('list length must be multiple of 2')
half_length = length / 2
if half_length % 2 != 0:
if half_length == 1:
return
else:
for i in range(start_index+half_length - 1, start_index+length - 2):
temp = input_list[i]
input_list[i] = input_list[i+1]
input_list[i+1] = temp
half_length = half_length - 2
perfectShuffle(input_list, start_index, end_index - 2)
else:
quarter_length = half_length/2
for i in range(start_index + quarter_length, start_index+half_length):
temp = input_list[i]
input_list[i] = input_list[i+quarter_length]
input_list[i+quarter_length] = temp
perfectShuffle(input_list, start_index , start_index + half_length - 1)
perfectShuffle(input_list, start_index + half_length, start_index + length - 1)