折纸问题(规律题)(map的使用)

来源:互联网 发布:淘宝怎么找工厂做衣服 编辑:程序博客网 时间:2024/04/28 13:53

题目描述

请把纸条竖着放在桌⼦上,然后从纸条的下边向上⽅对折,压出折痕后再展 开。此时有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)


0 0
原创粉丝点击