Day1
论坛小白第一次使用CSDN编写博客,也是第一次在leetcode上学习代码,鉴于工作中无法使用博客,时间有限,只能从零开始慢慢尝试,在和大家的共同学习中看到自己一点一滴的进步
题目描述
给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
示例:
输入: 13
输出: 6
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。
使用语言python
解题思路
总:
取每一位数字,遍历所有包含1的个数,枚举所有情况
分:
1.获取数字位数
2.判断大于1的位数个数num
3.写出各种出现的情况(1个1 2个1 … num个数1)
4.枚举各种情况下的个数
实现代码
class Solution:
def countDigitOne(self, n):
"""
:type n: int
:rtype: int
"""
if n<10:
su=0
for i in range (1,n+1):
x=i
while x>0:
if x%10==1:
su=su+1
x=x//10
return su
else:
num=[]
y=n
while y>=1:
num.append(y%10)
y=y//10
a=n-num[-1]*(10**(len(num)-1))
b=10**(len(num)-1)
if num[-1]!=1:
su=Solution.countDigitOne(self, a)+b+num[-1]*Solution.countDigitOne(self,b-1)
return su
else:
su=Solution.countDigitOne(self, b-1)+Solution.countDigitOne(self,a)+1+(n-b)
return su