日常练习+讨论:Lintcode 9. Fizz Buzz 问题 Python

其实这个问题挺有名的,简单概述一下就是3换成Fizz,5换成Buzz,公倍数就FizzBuzz。
我之前在leetcode上做题的时候也遇到了,但是因为感觉简单,所以没有在意。
今天…Cisse-away突然问我是否做了这道题,我还心想这么简单的题不应该有什么蹊跷啊,但是他想问的题怎么可能简单呢,
果然,他是看了lintcode网站上的挑战,只用一个if来完成这个题,还说用python才能实现,顺便给了我一个链接:

https://segmentfault.com/a/1190000000378755

这个里面是Fizz Buzz Bazz,分别对应3,5,7,用最短代码解决。
这个就很神奇了,其中的python代码:

[''.join([w+'zz'for n,w in{3:'Fi',5:'Bu',7:'Ba'}.items()if x%n<1])or x for x in range(1,101)]

就这一行,讲真,刚开始我是一点都看不懂的。但是我看他十分有兴致,于是陪他开始研究这个“破”玩意。(令人疯狂)
其中两个列表生成式,一个列表是 if用来判断整除,之后遍历Dictionary来返回要显示的文字,如果没有满足整除条件就会生成空列表,如果是非空的列表,再用join()函数连接成相应字符串,最后再用or来判断取字符串还是数字组成最后的大列表。
其中items()函数用来返回遍历Dictionary生成的元组。

之后写lintcode上的原题:

题目:

给你一个整数n. 从 1 到 n 按照下面的规则打印每个数:
如果这个数被3整除,打印fizz.
如果这个数被5整除,打印buzz.
如果这个数能同时被3和5整除,打印fizz buzz.

样例:

比如 n = 15, 返回一个字符串数组:

[
“1”, “2”, “fizz”,
“4”, “buzz”, “fizz”,
“7”, “8”, “fizz”,
“buzz”, “11”, “fizz”,
“13”, “14”, “fizz buzz”
]

下面上代码:

class Solution:
    """
    @param: n: An integer
    @return: A list of strings.
    """
    def fizzBuzz(self, n):
        # write your code here
        a = {3:'fi',5:'bu'}
        final = [' '.join([w+'zz'for n,w in a.items()if x%n<1]) or str(x) for x in range(1,n+1)]
        return final

这里就用了上面链接的文章里面的方法,用了一个if解决。
这里要注意的点有两个,lintcode上,输出的两个单词是有空格的,所以是要用

' '.join()

是用空格连接。
还有一点就是,返回的list中,元素都是字符串,所以要用

... or str(x) for x in range(1,n+1)

把数字转化成字符串,这样才能通过,我因为这个错误了一次。

大概就是这样,不用一个if的话,就简单一些了。
大佬的力量是伟大的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值