欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 和 + 就是正常的字符串,没有特殊意义

成绩

python & LintCode算法练习:Fizz Buzz问题


PS

1、LintCode好像不能导入numpy库,本来是想用矩阵的
2、考虑到如果是在列表中处理数据要循环、遍历,耗时比较久,所以选择在字符串中用正则表达式处理。或者有什么其他简便的方法我不知道的。
3、正则表达式我也是菜鸟,如果有什么简便的写法欢迎指教