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

题目描述

请把纸条竖着放在桌⼦上,然后从纸条的下边向上⽅对折,压出折痕后再展 开。此时有1条折痕,突起的⽅向指向纸条的背⾯,这条折痕叫做“下”折痕 ;突起的⽅向指向纸条正⾯的折痕叫做“上”折痕。如果每次都从下边向上⽅ 对折,对折N次。请从上到下计算出所有折痕的⽅向。

给定折的次数n,请返回从上到下的折痕的数组,若为下折痕则对应元素为"down",若为上折痕则为"up".

测试样例:
1
返回:["down"]

题意分析:

拿一张纸,正对着自己,从下往上折,如果折痕正对着自己,则是up;否则是down。

假设 down 为 0, up 为 1。

折纸问题(规律题)(map的使用)_第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)


你可能感兴趣的:(ACM-2016校招真题)