【剑指Offer】31整数中1出现的次数(从1到n整数中1出现的次数)

题目描述

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

时间限制:1秒;空间限制:32768K

解题思路

思路一

对于一个数s利用循环移位和除10取余数的方法记录出现了几次1,再对从1到n的所有数遍历记录结果。算法复杂度高。

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        # write code here
        count = 0
        while n > 0: #遍历1到n中每个数
            s = n
            while s > 0: #记录当前数s中1的个数
                if s%10 == 1:
                    count += 1
                s = s//10 #数s去掉最后一位
            n -= 1
        return count

思路二

按位计算,记录每一位上会出现多少个1,累加返回结果。

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        # write code here
        count = 0 #记录结果
        tmp = n
        base = 1  #记录当前位数
        while tmp:
            last = tmp % 10 #最后一位数
            tmp = tmp / 10  #右移一位
            count += tmp * base
            # 最后一位为1的情况比较特殊,单独讨论
            if last == 1:
                count += n % base + 1
            elif last > 1:
                count += base
            base *= 10
        return count

 

posted @ 2018-10-22 10:00  yucen  阅读(126)  评论(0编辑  收藏  举报