题解 | #整数中1出现的次数(从1到n整数中1出现的次数)#
整数中1出现的次数(从1到n整数中1出现的次数)
http://www.nowcoder.com/practice/bd7f978302044eee894445e244c7eee6
感谢b站大佬蛋包饭的解析
指路:https://www.bilibili.com/video/BV1v5411J77K?from=search&seid=17761552908248216018
建议大伙看看,讲的挺不错的
具体思想为:
设分析的数据n=6501234
假设我们现在分析百位数字也就是2
定义base=100
a = n / base / 10
b = n % base
cur = n / base % 10;
数可分成三个部分(分别设为a,cur,b):
6501——2——34
a ——cur———b
此时百位出现1的次数为:
(6501+1)* 100(这里的+1加的是a为0000的情况)
即当所分析位数为1时,出现次数为 (a+1) * base
假设我们现在分析千位数字也就是1
定义base=1000
a = n / base / 10
b = n % base
cur = n / base % 10;
数可分成三个部分(分别设为a,cur,b):
650——1——234
a ——cur———b
此时千位出现1的次数为两部分:
第一部分为650 * 1000,第二部分则只包含234+1(这里的+1加的是当b为000时的情况)
即当所分析位数为1时,出现次数为 a*base+b+1
假设我们现在分析万位数字也就是0
定义base=10000
a = n / base / 10
b = n % base
cur = n / base % 10;
数可分成三个部分(分别设为a,cur,b):
65——0——1234
a ——cur———b
此时万位出现1的次数为:
65 * 10000
即当所分析位数小于1时,出现次数为 a * base
附上源代码:
public class Solution { public int NumberOf1Between1AndN_Solution(int n) { int base = 1; int res = 0; int b = 0; int a = 0; int cur = 0; while(base<=n){ b = n % base; a = n/base; cur = a % 10; a = a/10; if(cur>1){ res = res + (a+1)*base; }else if(cur == 1){ res = res + a*base+b+1; }else{ res = res + a*base; } base = base * 10; } return res; } }