leetcode原题链接:https://leetcode.com/problems/number-of-digit-one/
题目描述: 要求寻找整数1到n之间所有数字中,1出现的次数。如给定数字15,那么1到15之间出现1的数字为:1、10、11、12、13、14、15,共出现8次。
方法一: 我们可以用最简单的办法先尝试一下,遍历1到n中间的每个整数,对每个整数从低位到高位依次检查,如果有1出现则计数器自加。
public int countOnes1(int n){
int count = 0;
for(int i = 0; i <= n; i++){
int cur = i;
while(cur > 0){
int tmp = (int) i%10;
if(tmp == 1) count++;
cur = cur/10;
}
}
return count;
}
这样计算方式比较直观。但是这个函数在leetcode上提交后会报计算超时的错误。因为两层嵌套的话复杂度提升了,对于大数值来说,计算时间也随之增加。
方法二:
既然直观的方法不能满足要求,那智能寻找规律了。先来看几组数字。
对于两位数: