一、题目
求出 1 ~ 13 的整数中 1 出现的次数, 并算出 100 ~ 1300 的整数中 1 出现的次数?为此他特别数了一下 1 ~ 13 中包含 1 的数字有 1、10、11、12、13 因此共出现 6 次, 但是对于后面问题他就没辙了。ACMer 希望你们帮帮他, 并把问题更加普遍化, 可以很快的求出任意非负整数区间中 1 出现的次数(从 1 到 n 中 1 出现的次数)。
二、分析及代码
1. 按位递归
(1)思路
可以对整数 n 的各个十进制位依次进行处理。
若第 k 位的数字为 a,即 n / (10 ^ k) = a,则在连续的 a * 10 ^ k 个数字中,数字 1 的个数为 a * k * 10 ^ (k - 1) 个(可理解为选择其中一位数字为 1,其他 k - 1 位可以有 10 ^ (k - 1) 种排列方式)。
结合上述算法,通过递归即可求出从 1 到 n 中 1 出现的次数。
(2)代码
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
if (n <= 0)
return 0;
int num = n / 10, k = 10, b = 1, ans = 0;
if (n % 10 != 0) //个位特殊处理,从十位开始可用通用算法
ans++;
while (num != 0) {
int a = num % 10;
if (a == 1)
ans += a * b * k / 10 + n % k + 1;
else if (a == 0)
ans += 0;
else
ans += k + a * b * k / 10;
num = num / 10;
k *= 10;
b++;
}
return ans;
}
}
(3)结果
运行时间:23ms,占用内存:9428k。
三、其他
暂无。