整数中1出现的次数
题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
思考: 可以考虑用递归的方式,那么,递归什么时候截止呢? 递归到个位数!
( 不对,从高位到低位进行递归, 不如从低位到高位进行递归方便 不对,就得从高位到低位递归!!!)
比如2034 , 0到9 有1个1 0到99 有 20个1 0到999 有 10*f(99)+100=300
所以2024= 2*f(999)+1000 +2*f(9)+10 +1
没能通过所有测试用例:
public class Solution { public int NumberOf1Between1AndN_Solution(int n) { int res=0,a1=1,a2=0,b=1; while(n>0){ int num=n%10; a1=a1*b; res=res+a1+(num+1)*a2; a2=a1; b=b*10; n=n/10; } return res; } }
判断每一位的数字! 将数字分为 : 高位 当前位 低位。 根据当前位的数值不同进行不同的处理!!!!
class Solution { public int countDigitOne(int n) { int digit=1,res=0; int high=n/10,cur=n%10,low=0; while(high!=0 || cur!=0){ if(cur==0) res=res+high*digit; else if(cur==1) res=res+high*digit+low+1; else if(cur>1) res=res+(high+1)*digit; low=low+cur*digit; cur=high%10; high=high/10; digit=digit*10; } return res; } }
也许会有遗憾,但是不应该在失败之前
浙公网安备 33010602011771号