整数中1出现的次数(从1到n整数中1出现的次数)

整数中1出现的次数(从1到n整数中1出现的次数)_牛客网

https://www.nowcoder.com/practice/bd7f978302044eee894445e244c7eee6?tpId=13&tqId=11184&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

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

思路:寻找规律可以发现,对于个位,数字1每隔10出现1次;对于十位,数字1每隔100出现1次;对于百位,数字1每隔1000出现100次;...对于不完整的部分,比如15,只需要对10取余加1即可。综上,变量有间隔次数和出现次数,同时要注意不完整部分,可以利用辗转相除的思想。

def NumberOf1Between1AndN_Solution(self, n):
    # write code here
    temp = n
    res = 0
    base = 1#出现次数
    while temp:
        p = temp % 10#不完整部分
        temp = temp / 10
        res += temp * base#乘出现次数
        if p == 1:
            res += n % base+1
        elif p > 1:
            res += base
        base*=10
    return res
全部评论
我严重怀疑这代码不是你自己写的,因为感觉你自己都不知道这个代码在干什么事情,注释都错了 不懂请不要装懂误导别人 这个代码的核心思想就是找出各个位数上1的个数,和辗转相除一点关系都没有 重新注释了一下,有兴趣的就看看吧 def NumberOf1Between1AndN_Solution(n):     temp = n     res = 0     base = 1                            # 应该是指位数,1表示个位,10表示十位....     while temp:         p = temp % 10                   # 取出当前位         temp = temp // 10         res += temp * base              # temp * base得到该位的出现次数         if p == 1:             # 如果这个位数是1,那么还要算上这个位数1出现的次数             # 举例: 1141的百位             # 上面temp * base即1 * 100算出的是1000前百位为1的个数,1100到1141百位上的1没统计到,因此最终结果还要加上42个             res += n % base + 1         elif p > 1:             # 如果这个位数大于1,那么这个位数的1还出现了base次             # 举例: 1141的十位             # 上面temp * base即11 * 10算出的是1100前十位为1的个数,1100后还有10个没统计到             res += base         base *= 10     return res
12 回复 分享
发布于 2019-10-07 17:08
解释上述代码: 每十位 个位出现1的次数为1, 每百位十位出现1的次数为10,每千位百位出现的次数为100,中间if判断所求余数就是为了计算不够整十整百的 如215 每十位个位出现1为21, 因为有21个十,因为余数大于1,还需计算1~5出现1次1,此时215个位为1的次数有22次, 再来看十位为1的次数,215有两个一百,故十位出现1的次数有20,因为200~215不够整百,十位出现1的只有10~15六个,所以十位出现1的次数有20+6=26个,整千出现100次1(即100~199)因为215在1000内,百位只有1个100个1(即1*100),差不多就这意思
2 回复 分享
发布于 2020-01-12 10:47
还是看不太懂,文字和代码说明不太能对得上。
点赞 回复 分享
发布于 2019-09-17 14:31

相关推荐

11-07 13:31
怀化学院 Java
勇敢牛牛不怕难:又疯一个
点赞 评论 收藏
分享
10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
7 收藏 评论
分享
牛客网
牛客企业服务