JZ31 整数中1出现的次数
原题链接
描述
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如:1~13中包含1的数字有1、10、11、12、13因此共出现6次。
示例
输入:13
返回值:6
思路
要求从 1~ n 的所有数中 1 出现的次数,换个说法就是求出从地位到 n 的最高位(个十百千万……)中总共出现的 1 的次数。这样把以 cur(图中Δ) 作为要统计出现 1 的个数的位置,把 n 分成 high 和 low 两个部分,然后讨论 cur:
- cur = 0。此时该位出现 1 的次数就是 high * γ(cur所在位代表的权重,1、10、100等);
- cur = 1。此时该位置出现 1 的次数就是 high * γ + low + 1。
- cur > 1。此时该位置出现 1 的次数就是 ( high+1 ) * γ + low + 1。


(图二源自https://www.bilibili.com/video/BV1v5411J77K)
解答
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
int res = 0, cur = n % 10, low = 0, high = n / 10, round = 1;
while (cur != 0 || high != 0) {
if (cur == 0) {
res += high * round;
} else if (cur == 1) {
res += high * round + low + 1;
} else {
res += (high + 1) * round;
}
low += cur * round;
cur = high % 10;
high = high / 10;
round *= 10;
}
return res;
}
}
本文来自博客园,作者:klaus08,转载请注明原文链接:https://www.cnblogs.com/klaus08/p/15192078.html

JZ31 整数中1出现的次数
浙公网安备 33010602011771号