zoukankan      html  css  js  c++  java
  • 【LeetCode】233. Number of Digit One

    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.

    Hint:

      1. Beware of overflow.

    难题的惯例是先上保底做法。逐个数字数1,累加。

    虽然知道会TLE,总比空着白板好。

    class Solution {
    public:
        int countDigitOne(int n) {
            int ret = 0;
            if(n <= 0)
                return ret;
            for(int i = 1; i <= n; i ++)
            {
                ret += countOne(i);
            }
            return ret;
        }
        int countOne(int n)
        {
            int ret = 0;
            while(n)
            {
                if(n % 10 == 1)
                    ret ++;
                n /= 10;
            }
            return ret;
        }
    };

    下面上标准做法,参考了编程之美。

    这题可以扩展为其他进制的情况。

    从右到左逐位计数当前位置(记为cur)为1的所有数字。

    (1)cur为0时,需要计数的部分为:cur位置为1,然后对于高位0~high-1的每个值,低位遍历0~divisor。

    因此总数为high * divisor

    (2)cur为1时,需要计数的部分为:除了上述cur为0的部分,再补充cur为1时,低位遍历0~low。

    因此总数为high * divisor + low + 1

    (3)cur为其他数时,需要计数的部分为:

    cur位置为1,然后对于高位0~high的每个值,低位遍历0~divisor。

    因此总数为(high + 1) * divisor

    class Solution {
    public:
        int countDigitOne(int n) {
            if(n <= 0)
                return 0;
            int ret = 0;
            int base = 10;
            long long divisor = 1;
            while(n / divisor)
            {
                int high = n / (divisor * base);
                int cur = n / divisor % base;
                int low = n - n / divisor * divisor;
                if(cur == 0)
                    ret = ret + high * divisor;
                else if(cur == 1)
                    ret = ret + high * divisor + low + 1;
                else
                    ret = ret + (high + 1) * divisor;
                divisor *= base;
            }
            return ret;
        }
    };

  • 相关阅读:
    GUI学习笔记之一“Hello world”程序
    GDI和GUI的区别
    Convert.Int32、(int)和int.Parse三者的区别
    华为机试题汇总
    算法导论 第7章 课后习题
    算法导论 第8章 线性时间排序 课后习题
    算法导论 第21章 不相交集合的数据结构
    [转载]NIM(1) 一排石头的游戏
    算法导论 第22章 图论之拓扑排序
    编程珠玑第八章 算法设计艺术
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4642551.html
Copyright © 2011-2022 走看看