目录
传统版本
题目描述
试计算在区间 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不是静态类型语言,数据类型是在程序执行过程中确定的,所以我们需要把结果强制转换成整型来操作。
传统代码
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)
封神版本
两行代码
n,x=map(int,input().split())
print((("".join([str(i) for i in range(0,n+1)])).strip()).count(str(x),0))
二次改进
n,x=map(int,input().split())
print(str([i for i in range(n+1)]).strip().count(str(x),0))
三次改进
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('我并不知道要做什么'))
其实就是将后面的以前面的作为间隔分开再拼成字符串。
对于列表、字典、集合也适用:
print(' '.join(['I','love','you','!']))
我们代码中的"".join()就是不间隔开直接拼起来。
咦,好像也不需要用到join,我为啥不直接用str()转字符串呢?
好了,经实践表明,这个也可以实现:
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出现的次数。
完事,再修改一下下,完美。