【python解题笔记20210318】CodeWars:Count the smiley faces!

题目

内容:根据要求的规则,检测输入的列表中的符号,能否组成笑脸,输出笑脸的总数量

链接:https://www.codewars.com/kata/583203e6eb35d7980400002a/train/python

截图:

   

解题

思路: 

1、最重要是搞清楚如何根据不同数量符号组合的算法,检测出能否合成笑脸;

2、然后再看是否包含检测出笑脸外的符号,若有,也不符合规范;

3、使用re.sub(pattern, repl, string, count=0, flags=0)函数,巧妙的将组成笑脸的字符串全部替换成空字符串,起到删除组成笑脸字符串的作用,若此番处理后包含其他字符串则不符合笑脸组成规范;

结果:

   

源码:

import re

def count_smileys(arr):
    """
    根据要求的规则,检测输入的列表中的符号,能否组成笑脸,输出笑脸的总数量
    :param arr: 输入的笑脸列表,如[':D',':~)',';~D',':)']
    :return: 检测后笑脸的数量 ,如上述例子中结果为4
    """
    count=0
    if arr==[]:
        return count
    else:
        for i in arr:
            print(i)
            # 第一层检测:通过算法检测字符串中的符号能否组成笑脸
            if i.count(':')+i.count(';')==1 and i.count('D')+i.count(')')==1 and i.count('-')+i.count('~')<=1:
                #第二层检测:检测是否存在组成笑脸外的其他符号,若存在则不符合笑脸组成规则。
                i = re.sub("[-:;)D~]", '', i)   # 这里注意sub函数中减号字符'-'要放在第一个 不然会被当作算术操作符
                if len(i)==0:
                    count+=1
                pass
            pass
        return count
    pass


print(count_smileys([':D',':~)',';~D',':)']))

知识点

1、要考虑算法问题,十分重要!!!

2、re.sub()函数算法,可以替换字符串中的指定字符

re.sub(pattern, repl, string, count=0, flags=0)

参数:

    • pattern : 正则中的模式字符串。
    • repl : 替换的字符串,也可为一个函数。
    • string : 要被查找替换的原始字符串。
    • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

参考资料:

https://zhuanlan.zhihu.com/p/114457332

原文地址:https://www.cnblogs.com/chooperman/p/14555724.html