python & LintCode算法练习:Fizz Buzz问题
程序员文章站
2022-03-24 17:37:56
...
问题详情
给你一个整数n. 从 1 到 n 按照下面的规则打印每个数:
如果这个数被3整除,打印fizz.
如果这个数被5整除,打印buzz.
如果这个数能同时被3和5整除,打印fizz buzz.
如果这个数既不能被 3 整除也不能被 5 整除,打印数字本身。
https://www.lintcode.com/problem/fizz-buzz/description
代码
import re
class Solution:
"""
@param n: An integer
@return: A list of strings.
"""
def fizzBuzz(self, n):
# write your code here
n0 = n #记录一共有多少个数据,下面n的值会变
if n % 15 != 0:
n = (n // 15 + 1)*15
#如果n不是15的倍数就让它补齐成15的倍数,要不然后面的正则会匹配不到
n_str = "+".join(map(lambda x: str(x), range(1, n + 1))) + "+"
#用range()生成列表,列表转换成字符串
#n_str = 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15
result = re.sub(r"((\d*\+){2})\d*(\+\d*\+)\d*(\+)\d*(\+)((\d*\+){2})\d*(\+)\d*(\+\d*\+)\d*(\+)((\d*\+){2})\d*\+",r"\1fizz\3buzz\4fizz\5\6fizz\8buzz\9fizz\10\11fizz buzz+",n_str)
# 用正则匹配,15个数为一个整体,第3、6、9、12个数替换成“fizz”,第5、10个数替换成“buzz”,第15个数替换成“fizz buzz”
#result = 1+2+fizz+4+buzz+fizz+7+8+fizz+buzz+11+fizz+13+14+fizz buzz
result_list = result.split("+")[0:n0]
#将字符串转换成数组,取前n0个元素
return result_list
正则表达式详解
表达式:
((\d*\+){2})\d*(\+\d*\+)\d*(\+)\d*(\+)((\d*\+){2})\d*(\+)\d*(\+\d*\+)\d*(\+)((\d*\+){2})\d*\+
表达式 | 解释 | 具体例子 |
---|---|---|
\d* | 任意多个数字 | 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
\+ | 匹配“+”号,因为“+”是特殊字符,所以要前面加个“\”转义 | + |
((\d*\+){2}) | (任意个数字&“+”){2次} | 1+2+,7+8+,13+14+,… |
(…) | 括号表示分组 |
替换式:
\1fizz\3buzz\4fizz\5\6fizz\8buzz\9fizz\10\11fizz buzz+
表达式 | 解释 | 具体例子 |
---|---|---|
\数字 | 表示指定分组的内容,数字按照,表达式从左到右的分组括号的顺序排 | \1->1+2+,\3->+4+,… |
fizz 和 buzz 和 + | 就是正常的字符串,没有特殊意义 |
成绩
PS
1、LintCode好像不能导入numpy库,本来是想用矩阵的
2、考虑到如果是在列表中处理数据要循环、遍历,耗时比较久,所以选择在字符串中用正则表达式处理。或者有什么其他简便的方法我不知道的。
3、正则表达式我也是菜鸟,如果有什么简便的写法欢迎指教
上一篇: LintCode:192.通配符匹配(考点:动态规划)
下一篇: 二维数组最大连通子数组之和