Fork me on GitHub

【LeetCode】233. 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)
posted @ 2016-03-13 16:37  __Neo  阅读(167)  评论(0编辑  收藏  举报