输入一个整数n,求1-n这n个整数的十进制表示中1出现的次数。
将整数n变成字符串的形式,提取出字符串的首字符first_num。
如果first_num==1,则以1为首位的整数的个数为去掉其首位数字的大小加1,例如12345,万位为1的数字个数为2346。
如果first_num不等于1,则以1为首位的整数的个数为10的n次方,n为字符串长度减1,例如:23456中以1为首位的整数的个数为10^4;
2345中以1为首位的整数的个数为10^3;
接下来判断首位之后的位置出现1的次数,从第二位开始分别固定每个位置,根据排列组合,每个位置出现1的概率为first_num*(n-1)*10^(n-2)
最后调用递归判断以第二位置为首的数字出现1的个数。
python代码:
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1Between1AndN_Solution(self, n):
# write code here
if n <= 0:
return 0
if n < 10 and n > 0:
return 1
str_num = str(n)
length = len(str_num)
first_num = str_num[0]
if first_num == '1':
num1 = n - self.tencifang(length - 1) + 1
else:
num1 = self.tencifang(length - 1)
print(num1)
num2 = int(first_num) * (length - 1) * self.tencifang(length - 2)
print(num2)
num3 = self.NumberOf1Between1AndN_Solution(n - int(first_num) * self.tencifang(length - 1))
print(num3)
return num1 + num2 + num3
def tencifang(self, n):
result = 1
for i in range(0, n):
result *= 10
return result
if __name__ == '__main__':
solution = Solution()
print(solution.NumberOf1Between1AndN_Solution(10))