剑指offer(python)-题目31-整数1中出现的次数

本文介绍了一种计算1至任意非负整数n中数字1出现总次数的算法,提供了三种实现方法,包括将数字转化为字符串查找、遍历计数及优化算法,并附带了一个统计序列中出现最多整数的附加问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

思路1:
将1~n的所有数字转化成str然后把所有的str合成一个str找出这个str中1的个数
map(函数,数组)

class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        if n > 0:
            number = ''.join(map(str, range(1,n+1)))  #Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
            one_times = number.count('1')
            return one_times
        else:
            return 0
   或者
   

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        # write code here
        return ''.join(map(str, range(n+1))).count('1')
# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        ones,m =0,1
        while m<=n:
            ones += (n//m+8)//10*m + (n//m%10==1)*(n%m+1)
            m *= 10
        return ones

拓展:计算1至n中数字X出现的次数
这是一道比较简单的题目,举个例子先:假设 n=11,X=1,那么就是求 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 这 11 个数字中 1 出现的次数,很容易能看出来结果为 4,在 1 和 10 中各出现了一次,在 11 中出现了两次。

方法1:l类似上面的

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        # write code here
        return ''.join(map(str, range(n+1))).count('1')  #把1变成0-9的数字即可

方法2:
最简单的办法就是依次遍历 1 至 n,再分别求每个数字中 X 出现的次数,代码如下所示:

class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        count=0
        for i in range(1,n+1):
            while i:
                if i%10==1:
                    count+=1
                i=i/10
        return count

方法3:
https://blog.youkuaiyun.com/yi_afly/article/details/52012593

拓展2:
本题要求统计一个整型序列中出现次数最多的整数及其出现次数。

输入格式:
输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。

输出格式:
在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。

思路:

通过建立两个列表,把字符串转换成数字储存在第一个列表里。

然后遍历列表1,将列表1出现的数字出现的次数同步到列表2,最后找到列表2最大的下标,输出。

通过建立两个列表,把字符串转换成数字储存在第一个列表里。

然后遍历列表1,将列表1出现的数字出现的次数同步到列表2,最后找到列表2最大的下标,输出。

代码如下:

l=[]
a=input().split()
for i in a:
  l.append(int(i))
l2=[]
for i in l:
    count=0
    for j in l:
        if i==j:
            count=count+1
    l2.append(count)
max=l2[0]
for i in range(len(l2)):
    if l2[i]>=max:
        t=i
        max=l2[i]
print("{} {}".format(l[t],max))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值