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);