第 60 日:1~n 整数中 1 出现的次数
题目
解题
-
数学、动态规划
解题思路:
要求计算1~n
出现1
的次数,也就相当于求数字n
中每一位为1
时可以出现的可能性。例如 :n=12 结果为: 5 ##计算思路如下: 当个位为1时 有 01、11 当十位为1时 有 10、11、12 ##了解了上边计算思路就可以开始伪代码演示了: 1.首先设置3个变量l、cur、r分别代表左高位、当前位、右低位 以12举例就是,l=1,cur=2,r=0;当前位标志digit为1(后面会10、100、1000...) 2.当前位结果等于res=l*digit+digit=1*1+1=2 3.计算十位的结果等于res=l*digit+r+1=0*10+2+1=3 4.将res累加就是最后的结果
这里要注意的是,要根据当前位的值,选择计算res的方法:
上图来自男神K神详细代码如下:
public int countDigitOne(int n) { int l=n/10,cur=n%10,r=0;//l代表高位 cur代表当前一位 r代表低位 int digit=1;//当前位10 100 100... int res=0;//结果 while(cur!=0 || l!=0){ if (cur==0){ res+=l*digit; }else if (cur==1){ res+=l*digit+r+1; }else if (cur>1){ res+=l*digit+digit; } //低位左进 r=cur*digit+r; //当前位左移 cur=l%10; //高位左进 l=l/10; //当前位数变化 digit*=10; } return res; }