输出从 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知识点超多呢!