LeetCode233. Number of Digit One

Posted jdneo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode233. Number of Digit One相关的知识,希望对你有一定的参考价值。

题目:

Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.

For example:

Given n = 13,

Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.

代码:

class Solution {
public:
    int countDigitOne(int n) {
        int ones = 0;
        for (long long m = 1; m <= n; m *= 10) {
            ones += (n / m + 8) / 10 * m + (n / m % 10 == 1) * (n % m + 1);
        }
        return ones;
    }
};

提示:

这道题我们先给出代码,在对其进行分析。代码的主体逻辑是从最低位开始向左依次分析。

因为对于每一位,有几种情况需要分开去进行讨论,即:

  • 该位大于1:如果大于1,那么在该位出现1的次数为(n / m + 8) / 10 * m
  • 该位为0:如果该位是0,那么在上述式子(n / m + 8) / 10 * m中,+8不会产生进位,因此依然可以得到正确的答案
  • 该位为1:如果该位是1,那么虽然上述式子依然不会进位,但是我们还需要额外加上低位部分的个数,因此会有:(n / m % 10 == 1) * (n % m + 1)

以上是关于LeetCode233. Number of Digit One的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 233. Number of Digit One

LeetCode 233. Number of Digit One

LeetCode-233 Number of Digit One

[LeetCode]233 Number of Digit One(数位DP)

Leetcode 233 Number of Digit One

233 Number of Digit One 数字1的个数