1. 程式人生 > >Leetcode 233 Number of Digit One

Leetcode 233 Number of Digit One

solution lee -m 依據 1.8 leet 2.4 ret general

1. 問題描寫敘述

  給定一個整數n,在全部不大於n的非負整數中,計算包括數字1的整數的個數。比如n=13的結果為6。包括1的數字有1,10,11,12。13。


2. 方法與思路

  這個問題最直觀的方法就是累加1到n全部的包括1的數的個數。每一個數通過循環取余10的方法推斷是否包括1。可是這樣的思路效率並不高,數字n有logn位。總得時間復雜度為O(nlogn)
  利用數字的規律,簡化計算。以數字21567為例。先將數字分為兩段:“1到1567”和“1568到21567”。
  從1568到21567這段,分為兩種情況,1出如今最高位的情況。從10000到19999的數字中,包括1的一共出現了

104個,但對於數字12345,1出如今10000到12345的萬位的個數就是2345+1=2346次。

再看1出如今從1568到21567後4位的情況。

相同分成兩段,1568到11568和11569到21568。每一段剩下的4位書中,設當中一位是1,其它三位能夠是0~9之間的數,依據排列組合原理處理就可以。
  至於從1到1567利用遞歸就能夠了。
  

class Solution {
private:
    int numofOne(int n)
    {
        if(n == 0) return 0;
        if(n > 0 && n < 10
) return 1; int a = n,cnt = 0,num1,num2,num3; while(a/10) { a /=10; cnt++; } if(a > 1) num1 = pow(10,cnt); else if(a == 1) num1 = n%(int)pow(10,cnt)+1; num2 = a * (cnt)*pow(10,cnt-1); num3 = numofOne(n%(int
)pow(10,cnt)); return num1+num2+num3; } public: int countDigitOne(int n) { return numofOne(n); } };

Leetcode 233 Number of Digit One