其他分享
首页 > 其他分享> > 31-整数中1出现的次数(从1到n整数中1出现的次数)

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

作者:互联网


layout: post
title: 31-整数中1出现的次数(从1到n整数中1出现的次数)
category: 剑指offer
tags:
description:

题目描述

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


效率低:把数字转换成字符串,统计字符串中符号1的个数。

class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        # write code here
        if n < 1:
            return 0
        mystr = ''
        for i in range(1,n+1):
            mystr += str(i)
        count = 0
        for i in range(len(mystr)):
            if mystr[i] == '1':
                count += 1
        return count

效率高。

首先三个概念:每个数位的round,base和former,以数532里的数字3来说,round是5,base=10,former是2。

根据某个数位的round、base和former,有公式可以计算该数位上每个数字出现的次数。设该数位上的数是n,计算该数位上m出现的次数,有:

另外,最高数字位的round=0。而最低数字位,即个位,的former+1这一项等于0,base=1

class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        counts = []
        round = n
        base = 1
        while round:
            count = 0
            weight = round%10
            round = round/10
            former = n%base
            if weight < 1:
                count += round*base
            elif weight > 1:
                count += round*base + base
            else:
                count += round*base + former + 1 
            counts.append(count)
            base *= 10
        return sum(counts)

标签:count,数字,31,整数,former,次数,base,round
来源: https://blog.csdn.net/u012176591/article/details/100916895