每天两道LeetCodeHard:(34)

150 阅读1分钟

233. Number of Digit One

纯粹的数学题

题干:

Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.

解释:

让我们找所有比n小的数字总共有多少个1

思考:

直接举例子吧,比如3452这个数,可以分为高度为3,余数为452. 最高位,如果大于1,那么可以拆分为1000-1999,最高位贡献了1000个1. 然后再看最高位剩余的,实际上0-999和2000-2999的1的个数是一样的,所以就相当于有height*helper(999)个1 最后再来看452,没什么好说的,就helper(452) 然后全部加起来就是最后答案了。

答案:

class Solution(object):
    def countDigitOne(self, n):
        """
       用递归做的,可以改成记忆化搜索,加快时间
        """
        if n<=0: return 0
        if n<10: return 1
        last = int(str(n)[1:])
        power =  10**(len(str(n))-1)      
        high = int(str(n)[0])
        if high == 1:
            return self.countDigitOne(last) + self.countDigitOne(power-1) + last+1
        else:
            return power+high*self.countDigitOne(power-1) + self.countDigitOne(last);

答案补充: