# -*- coding:utf-8 -*- classSolution: defNumberOf1Between1AndN_Solution(self, n): str_n = '' for i inrange(1, n + 1): str_n += str(i) res = str_n.count('1') return res
# 利用组合数解题 # 依次遍历每一个数位,计算该位为1的数有多少个,将结果累加返回 # 每个数位计算的时候,对除去该位的前缀,后缀分别计算组合数 # 同时需要保证组合出的数字在n的范围之内,所以将情况分为三种,该数位原本为1或者为0,或者为其他 classSolution: defNumberOf1Between1AndN_Solution(self, n): # write code here if n == 1: # 边界情况 return1 ans = 0# 最后返回的1的个数 x = str(n) # n的字符串形式,便于前缀后缀的数字转换 for i inrange(len(x)): # 遍历每一个数位,计算该数位为1同时整个数在n之内的整数个数 pre = int(x[:i]) if x[:i] else0# 前缀,没有前缀为0 l = len(x[i + 1:]) # 后缀的长度 # 该位原本为0的时候,合法数的前缀必小于pre,范围为[0,pre),共有pre种,后缀任意均合法,共有10**l种 if x[i] == '0': ans += pre * 10 ** l # 该位原本为1的时候,合法数有两种 # 一种是前缀范围为[0,pre),共有pre种,后缀任意 # 另一种是前缀为pre,后缀范围[0,suf],共suf+1种 elif x[i] == '1': suf = int(x[i+1:]) if x[i+1:] else -1# 后缀范围,没有后缀为-1 ans += pre * 10 ** l + suf + 1 # 其他情况下,合法数前缀范围[0,pre],后缀任意 else: ans += (pre+1) * 10 ** l return ans