public class Solution {
public int countDigitOne(int n) {
if(n<=0)return 0;
return dfs(n);
}
private int dfs(int n){
int length = size(n);
if(length==1){
if(n==0)return 0;
else{
return 1;
}
}
if(length>1){
int count=0;//首位一的个数
int len = (n-(shengcheng(length-1)+1))/(shengcheng(length-1)+1);//shengcheng(length-1)+1,其实就是生成整跟n相同位数的整十数,如10,100,1000,10000000,
int firstNum = n/(shengcheng(length-1)+1);
int behindNum = n-firstNum*(shengcheng(length-1)+1);
if (len>0)count=shengcheng(length-1)+1;
else {
count = n-(shengcheng(length-1)+1)+1;
}
return dfs(shengcheng(length-1))+len*dfs(shengcheng(length-1))+count+dfs(behindNum);
}//比如321=dfs(99)+2*dfs(99)+100+dfs(21),dfs(1092)=dfs(999)+0*dfs(999)+92+dfs(92),那321来看最合适
return 0;
}
public int size(int n){//测量数的位数
int count = 1;
while (n/10>0){
n = n/10;
count++;
}
return count;
}
public int shengcheng(int n){//生成99.999.9999这样的数三位就是999,4位就是9999
int count=1;
for(int i=0;i<n;i++)
count = count*10;
return count-1;
}
}
233. Number of Digit One
最新推荐文章于 2025-04-12 02:29:14 发布
本文介绍了一个Java程序,用于计算从1到给定数字n之间所有数字中1出现的总次数。通过递归地分解问题并利用数学规律,该算法能够高效地解决这一挑战。
2550

被折叠的 条评论
为什么被折叠?



