转自:https://blog.csdn.net/You_are_my_dream/article/details/54849318
题目描述
请把纸条竖着放在桌⼦上,然后从纸条的下边向上⽅对折,压出折痕后再展 开。此时有1条折痕,突起的⽅向指向纸条的背⾯,这条折痕叫做“下”折痕 ;突起的⽅向指向纸条正⾯的折痕叫做“上”折痕。如果每次都从下边向上⽅ 对折,对折N次。请从上到下计算出所有折痕的⽅向。
给定折的次数n,请返回从上到下的折痕的数组,若为下折痕则对应元素为"down",若为上折痕则为"up".
测试样例:
1
返回:["down"]
题意分析:
拿一张纸,正对着自己,从下往上折,如果折痕正对着自己,则是up;否则是down。
假设 down 为 0, up 为 1。
通过观察上面的四组数据可以发现
1.在上次折叠的结果是这一个结果的起始。
2.以中间的元素为界把左右两边的元素分开,
以第三组结果为例:
左边为 0 0 1
右边为 0 1 1
左边元素取反:1 1 0
再上一步的基础上求逆序:0 1 1
可以发现结果就是右边的元素
所以 右边的元素 = 左边的元素各位取反,然后再逆序的结果
3.中间的元素:随着折痕的增多,左边元素和右边元素的个数永远相等,中间的元素永远是折纸次数为1的时候的结果(即为0)。
综上所述:对于输入的n次,逐次对上一次的结果进行保留,然后再对当前的列表中的元素进行取反然后再获得逆序,得到右边的元素,再原始结果的基础上中间加0,然后再加上之前所得到的右边的元素即可。
# -*- coding:utf-8 -*-
class FoldPaper:
def foldPaper(self, n):
# write code here
res = []
for i in range(n):
# print res
back = list(map(lambda x: not x, res[::-1]))
res += [False]
res += back
def IsBoolString(flag):
return "up" if flag else "down"
return list(map(IsBoolString, res))
if __name__ == "__main__":
a = FoldPaper()
print a.foldPaper(3)