python 解决
整数中1出现的次数(从1到n整数中1出现的次数)
http://www.nowcoder.com/questionTerminal/bd7f978302044eee894445e244c7eee6
思路:从位数入手,分成两部分,先确定左半部分的含1的个数,再确定右半部分含1的个数;计算当某一位为1时有多少种情况。
layer 为位数
举例:
个位:522 分成 52 2两个部分,当个位取1的时候,前边可以是 1-52,即可以生成 11,21,31,41...501,511,521共52个, 因为右边那部分 2>= ((10*02)-1)=1,所以还有一种情况是 1 所以当个位为1的时候有 52*1+1 = 53种
十位: 5 22 分成 5 22两个部分,因为 22>=((10*12)-1)=19,所以有 5*10+ 10 = 60种
百位: 522 分成 None 522 两个部分,因为522 >= ((10*22)-1)=199,所有有 0*100 + 100 = 100种
522 = 53 + 60 +100 = 213种
也许有人会困惑怎么确定右半部分,为什么是 右半部分>((10位数*2)-1) 就可以加 10位数
举个例子
十位为1 的话, 10-19中十位的位置上有十个1,520的话,分成 5 20 ,前边0-100,100-200,200-300,300-400,400-500 里边有 五个 10-19,所以左半部分可以直接 5*10=50,右边20的话因为20>19,包含了一个10-19,所以就是 50+ 10 = 60个
还有人会问,那如果左半部分((10*位数2)-1)呢,还是举个例子,
如果是509的话,直接pass,因为500-509十位的位置没有1,
如果是515的话,直接左半部分 19-15
百位的话以此类推
class Solution:
def NumberOf1Between1AndN_Solution(self, n):
# write code here
length, count = len(str(n)), 0
i = 1
while i <= length:
# 余数
remainder = n % 10 ** i
# 商
result = n // 10 ** i
# 位数
layer = 10 ** (i - 1)
count += result * layer
if remainder >= layer * 2 - 1:
count += layer
elif remainder < layer:
pass
else:
count += remainder - layer + 1
i += 1
return count