leetcode Fizz Buzz

输出从 1 到 n 数字的字符串表示。

1. 如果 n 是3的倍数,输出“Fizz”;

2. 如果 n 是5的倍数,输出“Buzz”;

3.如果 n 同时是3和5的倍数,输出 “FizzBuzz”。

示例:

n = 15

返回:
[
    "1",
    "2",
    "Fizz",
    "4",
    "Buzz",
    "Fizz",
    "7",
    "8",
    "Fizz",
    "Buzz",
    "11",
    "Fizz",
    "13",
    "14",
    "FizzBuzz"
]
链接:https://leetcode-cn.com/problems/fizz-buzz
 

暴力法,同时对于这道题来说,时间空间复杂度都不能更低了。

class Solution:
    def fizzBuzz(self, n):
        ls = []
        for i in range(1,n+1):
            if i%3==0 and i%5==0:
                ls.append('FizzBuzz')
            elif i%3==0 and i%5!=0:
                ls.append('Fizz')
            elif i%3!=0 and i%5==0:
                ls.append('Buzz')
            else:
                ls.append(str(i))
        return ls

自己想出来一个更简短一些的代码,但跑起来比暴力法稍慢一丢丢。

class Solution:
    def fizzBuzz(self, n):
        myfunc = lambda arg:0 if arg==0 else 1
        mydict = {(0,0):'FizzBuzz', (0,1):'Fizz', (1,0):'Buzz'}
        return [mydict.get((myfunc(i%3),myfunc(i%5)), str(i)) for i in range(1,n+1)]

以上两种方法都没有考虑到"FizzBuzz"字符串的特点——同时是3和5的倍数,其输出的字符串恰好是3的倍数与5的倍数输出的字符串拼接而成。

想到这一点,就不难想到再去利用字典。以下是官方解答:

class Solution:
    def fizzBuzz(self, n):
        ls = []
        fizz_buzz_dict = {3 : "Fizz", 5 : "Buzz"}
        
        for num in range(1,n+1):
            num_ans_str = ""
            
            for key in fizz_buzz_dict:
                if num % key == 0:
                    num_ans_str += fizz_buzz_dict[key]

            if not num_ans_str:
                num_ans_str = str(num)
            
            ls.append(num_ans_str)  
        
        return ls

这种代码就特别易于维护,不过跑起来就更慢了一点。

另外还看到一个大神一行代码解决战斗。

return ['Fizz' * (not i % 3) + 'Buzz' * (not i % 5) or str(i) for i in range(1, n+1)]

运行速度跟官答差不多。这一行代码蕴含的Python知识点超多呢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值