在编程珠玑学到了“翻掌算法”
就是我们试一下十元数组向上旋转5个位置的例子。
初始时掌心对着我们的脸,左手在右手上边,先将左手反转(掌心朝外,掌背朝我们的脸),再将右手翻转(同左手),最后两只手同时翻转,大家可以自己实验一下,挺有趣的。
下边放一下代码:
def ReversalList(list):
l = 0;
r = len(list) - 1;
while(l < r):
list[l], list[r] = list[r], list[l];
l += 1;
r -= 1;
return list;
def LeftReverseList(list, n):
LeftList = ReversalList(list[0 : n]);
RightList = ReversalList(list[n : len(list)]);
return ReversalList(LeftList + RightList);
def LeftReverseListTest(Max):
count = 0;
for i in range(0,Max):
list = [];
for j in range(0,i):
list.append(random.randint(-int(Max / 2), int(Max / 2)));
test = random.randint(0, i);
NewList = LeftReverseList(list, test);
print(test);
print(list);
print(NewList);
if (list != LeftReverseList(NewList, i - test)):
print(list);
print(i, ':error\n');
else:
count += 1;
if (count == Max):
print('allright');
return count;
if __name__ == '__main__':
Max = 10;
LeftReverseListTest(Max);
我们甚至可以对两端同时翻转,这样能大大提升速度。