和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

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:

  1. cur = 0。此时该位出现 1 的次数就是 high * γ(cur所在位代表的权重,1、10、100等);
  2. cur = 1。此时该位置出现 1 的次数就是 high * γ + low + 1。
  3. 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;
    }
}
posted @ 2021-08-26 23:33  klaus08  阅读(30)  评论(0)    收藏  举报