题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
思路:
方法一:最笨的方法
不断的对每个数进行除法+求余操作,来统计1出现的次数
时间复杂度分析:如果输入数字是n,n有O(logn)位,那么总的时间复杂度是O(n*logn)
方法二:从数字规律着手提高时间效率
上面这个方法是剑指offer上的,但是看得迷糊,看不懂
下面这个是见过的最清晰的思路:
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
int count = 0;//统计1的次数
int i = 1;//当前位数
int current ;//当前位数字
int high;//跟高位数字
int low;//低位数字
while((n/i) != 0){
current = (n/i)%10;
high = n/(i*10);
low = n%i;
if(current == 0){
count += high*i;
}else if(current == 1){
count = count + high*i + low+1;
}else{
count += (high+1)*i;
}
i *= 10;
}
return count;
}
}