摘要
- 问题不是关键,解法才是良心
leetcode问题描述
- 写一个程序,输出从 1 到 n 数字的字符串表示。
- 如果 n 是3的倍数,输出“Fizz”;
- 如果 n 是5的倍数,输出“Buzz”;
- 如果 n 同时是3和5的倍数,输出 “FizzBuzz”。
解题
这问题说真的,很简单,所以我的代码就成这样了:
def fizzBuzz(n):
result_list = list(range(1, n + 1))
for i in range(len(result_list)):
if result_list[i] % 3 == 0 and result_list[i] % 5 == 0:
result_list[i] = "FizzBuzz"
elif result_list[i] % 3 == 0:
result_list[i] = "Fizz"
elif result_list[i] % 5 == 0:
result_list[i] = "Buzz"
else:
result_list[i] = str(result_list[i])
return result_list
if __name__ == "__main__":
print(fizzBuzz(15))
不瞒你说,我觉得这么简单的问题,用这么冗余的代码解决是真low啊,所以我尝试用列表推导式配合三元运算符来搞定,但是经过测试,发现实现起来比较困难(也许就根本不能实现)。
于是我百度一下,看看大家都是怎么做的,所以我看到了一个比较有意思的解法,当然,这是我优化后的。
def fizzBuzz(n):
result_list = []
for i in range(1, n + 1):
result_list.append(
"Fizz"[(i % 3) * len("Fizz"):len("Fizz")] + "Buzz"[(i % 5) * len("Buzz"):len("Buzz")] or str(i))
return result_list
if __name__ == "__main__":
print(fizzBuzz(15))
乍一看,这是啥玩意?仔细分析一下还是挺有意思的。
我们来分析一下这段代码:
"Fizz"[(i % 3) * len(“Fizz”):len(“Fizz”)] + “Buzz”[(i % 5) * len(“Buzz”):len(“Buzz”)] or str(i))
- 首先,要知道,该段代码这只会返回一个值
- 其次,要知道,这主要是利用了字符串的切片和关键字 or
- 然后我完整的描述一下:当i为3的时候,取余就是0,从而就是
"Fizz"[ 0:4]
了,i为5的时候和i为3的时候一样,如果是15的话,那么就是相+
,如果是其它呢?这个or
就起了作用,传回了str(i)
。 - 同时,因为利用的是切片原理,所以其实仔细看一下,第二个
len("Fizz")
是可以去掉的。
总结:
有时候不要闭门造车,看看别人的逻辑,便会学会很多。