前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >计数问题 两行代码解决 Python

计数问题 两行代码解决 Python

作者头像
叶茂林
发布2023-07-30 10:46:59
1670
发布2023-07-30 10:46:59
举报
文章被收录于专栏:叶子的开发者社区

传统版本

题目描述

试计算在区间 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不是静态类型语言,数据类型是在程序执行过程中确定的,所以我们需要把结果强制转换成整型来操作。

传统代码

代码语言:javascript
复制
m,n=map(int,input().split())
count=0
for i in range(1,m+1):
    temp=i
    while temp:
        if temp%10==n:
            count=count+1
        temp=int(temp/10)
print(count)

封神版本 

两行代码

代码语言:javascript
复制
n,x=map(int,input().split())
print((("".join([str(i) for i in range(0,n+1)])).strip()).count(str(x),0))

二次改进 

代码语言:javascript
复制
n,x=map(int,input().split())
print(str([i for i in range(n+1)]).strip().count(str(x),0))

三次改进

代码语言:javascript
复制
n,x=map(int,input().split())
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('我并不知道要做什么'))

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

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

代码语言:javascript
复制
print('   '.join(['I','love','you','!']))

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

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

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

代码语言:javascript
复制
n,x=map(int,input().split())
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出现的次数。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 传统版本
    • 题目描述
      • 传统思路
        • 传统代码
        • 封神版本 
          • 两行代码
            • 二次改进 
              • 三次改进
                • 代码分析
                  • 列表推导式
                  • str()函数 
                  • str.join()函数 
                  • str.strip()函数
                  • str.count()函数
              相关产品与服务
              腾讯云代码分析
              腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档