• 计数问题 两行代码解决 Python


    目录

    传统版本

    题目描述

    传统思路

    传统代码

    封神版本 

    两行代码

    二次改进 

    三次改进

    代码分析

    列表推导式

    str()函数 

    str.join()函数 

    str.strip()函数

    str.count()函数


    传统版本

    题目描述

    试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?例如,在 1到 11 中,即在 1、2、3、4、5、6、7、8、9、10、11 中,数字 1 出现了 4 次。

    输入输出格式

    输入格式:

    输入共 1 行,包含 2 个整数 n、x,之间用一个空格隔开。

    输出格式:

    输出共 1 行,包含一个整数,表示 x 出现的次数。

    输入输出样例

    输入样例#1: 

    11 1

    输出样例#1: 

    4

    传统思路

    对于每一个数,我们首先将它按位数划分出来,提取它的各个位数,一一比对就行。

    具体操作就是:两个循环,外循环实现从1到n的所有整数,内循环实现每一个整数的各位上的数字比对,采用和10取余的方式取出它的各位,一次和10取余可以取出个位上的数字,之后让其除以10,就可以把十位上的数字拉到各位,如此反复直到它为0.

    要注意Python中的 / 不只是整除,python不是静态类型语言,数据类型是在程序执行过程中确定的,所以我们需要把结果强制转换成整型来操作。

    传统代码

    1. m,n=map(int,input().split())
    2. count=0
    3. for i in range(1,m+1):
    4. temp=i
    5. while temp:
    6. if temp%10==n:
    7. count=count+1
    8. temp=int(temp/10)
    9. print(count)

    封神版本 

    两行代码

    1. n,x=map(int,input().split())
    2. print((("".join([str(i) for i in range(0,n+1)])).strip()).count(str(x),0))

    二次改进 

    1. n,x=map(int,input().split())
    2. print(str([i for i in range(n+1)]).strip().count(str(x),0))

    三次改进

    1. n,x=map(int,input().split())
    2. print(str([i for i in range(n+1)]).count(str(x)))

    代码分析

    重要的不是只有两行代码,重要的是,这两行代码是怎么写出来的。

    为了方便大家阅读以及我个人讲解,我采用高一学习复杂英语句子的方式来给大家剥蚕抽丝。

    首先划分结构,为了方便理解,我把这两行代码拆开成下面这个模样:

    n,x=map(int,input().split())

    a=[str(i) for i in range(0,n+1)]

    b=("".join(a))

    c=(b.strip())

    d=c.count(str(x),0) print(d)

    然后是逐个知识点分析,个人感觉学Python就是学它的各种库函数的过程。

    首先是列表推导式

    列表推导式

    列表推导式简单的来说,就是用简洁的代码快速创建出列表的方式,如果你不知道什么是列表,请看浅谈Python列表及其增删改查_^o^叶子^0^的博客-CSDN博客_python列表的增删改查

    好了,举个列表推导式的使用例子:

    比如说我们想创建一个列表[0,1,2,3,4,5,6,7,8,9],常规的操作是这样的:

    a=[]

    for i in range(10): a.append(i)

    print(a)

    但是使用列表推导式可以一行代码搞定:

    print([i for i in range(10)])

    当然,列表推导式知识博大精深,远远不止这些东西,但是和我们这里的计数问题相关不大,有机会再聊,而且随着Python的发展,也出现了与之对应的字典推导式和集合推导式,这里不多说。我们进入下一个知识点,str()函数。

    str()函数 

    这个就很简单了,它就是,把括号里面东西的变成字符(串),像我们代码中的

    [str(i) for i in range(0,n+1)]

    就是创建0到n的一堆数字字符,那为什么要字符类型的呢?因为后面会解释到^_^。

    好了,我们进入下一个内容,str.join()函数

    str.join()函数 

    对于一些很简单的事情,我们往往不解释而直接给出结果:

    print('^_^'.join('000000000'))

     再看:

    print('¥'.join('我并不知道要做什么'))

    其实就是将后面的以前面的作为间隔分开再拼成字符串。

    对于列表、字典、集合也适用:

    print('   '.join(['I','love','you','!']))

    我们代码中的"".join()就是不间隔开直接拼起来。

    咦,好像也不需要用到join,我为啥不直接用str()转字符串呢?

    好了,经实践表明,这个也可以实现:

    1. n,x=map(int,input().split())
    2. print(str([i for i in range(n+1)]).strip().count(str(x),0))

    我……,这个看起来还简单一点,我真是服了T_T……

    好了,来到str.strip()函数

    str.strip()函数

    这个函数就是去掉首尾指定的字符,嗯……嗯!!!

    但是好像在这里没用啊T_T……

    这一天天的,我在干什么!

    好了,来到我们文章的末尾的count函数

    str.count()函数

    这个函数就很优秀了,它可以用来统计字符串里面某个字符(串)出现的次数。

    比如:count('X',3,7)就可以统计从第四个字符到第8个字符之间X出现的次数。

    完事,再修改一下下,完美。

  • 相关阅读:
    UJNOJ_1307: 数独 [for ACMer]_模拟
    【矩阵分解】PCA - 主成分分析中的数学原理
    文件的物理结构(连续分配,链接分配,索引分配)
    克拉默法则
    strlen函数使用与模拟实现【进阶版】
    星乐园项目┃助学无止境·探访暖人心
    【监督学习】基于合取子句进化算法(CCEA)和析取范式进化算法(DNFEA)解决分类问题(Matlab代码实现)
    Qt设置整体背景颜色
    < 今日份知识点:谈谈内存泄漏 及 在 Javascript 中 针对内存泄漏的垃圾回收机制 >
    解析navicate数据库密码
  • 原文地址:https://blog.csdn.net/weixin_62264287/article/details/126069288