zoukankan      html  css  js  c++  java
  • 【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)
  • 相关阅读:
    如何用vue实现树形菜单?
    spring+springMVC,声明式事务失效,原因以及解决办法
    java提高同步锁的几点建议
    java自定义before和after
    java线程池
    jdk并发工具包之锁
    ReentrentLock重入锁
    java守护线程
    ReentrantLock
    java多线程基础
  • 原文地址:https://www.cnblogs.com/jdneo/p/5272364.html
Copyright © 2011-2022 走看看