日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

求1~n这n个整数十进制表示中1出现的次数

發(fā)布時間:2023/12/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求1~n这n个整数十进制表示中1出现的次数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 題目
  • 思路
  • 代碼
  • 復雜度分析


題目

輸入一個整數(shù) n ,求1~n這n個整數(shù)的十進制表示中1出現(xiàn)的次數(shù)。

例如,輸入12,那么1~12這些整數(shù)中包含1 的數(shù)字有1、10、11和12。可得1一共出現(xiàn)了5次。


思路

將個位、十位……每位1出現(xiàn)的次數(shù)加起來就是1一共出現(xiàn)的次數(shù)。

以12為例,個位上1出現(xiàn)了 2 次分別是 01,11(暫時不看11的十位)。

十位上1出現(xiàn)了 3 次,分別是10,11,12。

因此1~12中1一共出現(xiàn)了 2+3=5 次。

兩位數(shù)不好找規(guī)律,我們以四位數(shù)為例。一個四位數(shù)十位上 1 出現(xiàn)的次數(shù),與十位上的值有關(guān)。根據(jù)值不同,可分為三種情況,值為0,1,2~9:

我們通過三個不同四位數(shù)進行探討,分別是 2304 , 2314 和 2324 :

我們將數(shù)字劃分為三部分,當前位(cur),高位(high),以及低位(low),用digit表示當前處于哪個數(shù)位。

  • 當 cur = 0 時: 此位 1 的出現(xiàn)次數(shù)只由高位 high 決定,計算公式為:
  • high×digit


    詳細分析:

    對于2304來講,十位出現(xiàn)1的范圍:0010~2219 沒有什么可多說的。

    那么1出現(xiàn)的次數(shù)怎么算呢?

    光看高位的話,00 ~ 22 總共有 23 種數(shù)字,也就是 001X ~ 221X 。而其中的 ‘X',有 0 ~ 9 總共 10 種取法,也就是說排列組合下來,可以構(gòu)成有 23*10=230 個十位為1的數(shù)字,如下表:

    highcurlow
    0010
    0011
    0012
    0013
    0014
    0015
    0016
    0017
    0018
    0019
    1
    2210
    2211
    2212
    2213
    2214
    2215
    2216
    2217
    2218
    2219
  • 當 cur = 1 時: 此位 1 的出現(xiàn)次數(shù)由高位 high 和低位 low 共同決定,計算公式為:
  • high×digit+low+1


    詳細分析:

    十位上1出現(xiàn)的次數(shù)怎么算呢?

    出現(xiàn) 1 的數(shù)字范圍: 0010 ~ 2314

    光看高位的話,有 00 ~ 23 總共 24 種組合排列方法,但是! 對于 00 ~ 22 這 23 種高位來講,低位都有 0 ~ 9 總共 10 種排列組合 —— 0010 ~ 0019 或 2210 ~ 2219 ,但是 23 不同,其低位只有 0 ~ 4 五種排列組合 —— 2310 ~ 2314 。因此,可以構(gòu)成 23*10+5=235 個十位為 1 的數(shù)字(23*10代表 【高位為00~22】 的所有數(shù)字,5代表 【高位為23】 的所有數(shù)字)。

  • 當 cur=2,3,?,9 時: 此位 1 的出現(xiàn)次數(shù)只由高位 high 決定,計算公式為:
  • (high+1)×digit


    詳細分析:

    十位上1出現(xiàn)的次數(shù)怎么算呢?

    此時與 cur=1 不同,cur=1 時出現(xiàn)的次數(shù)還需要看 low 的值,此時出現(xiàn) 1 的數(shù)字范圍: 0010 ~ 2319 ,也就是說,高位為 23 時,低位也有 0 ~ 9 共計 10 種排列組合方法,與高位為 00 ~ 22 時一樣,因此,cur=2~9 時,十位上 1 出現(xiàn)的次數(shù)為:24*10=240 。

    上面各圖源自jyd大佬


    代碼

    class Solution { public:int countDigitOne(int n) {long long digit = 1;int low = 0;int cur = n % 10;int high = n / 10;int sum = 0;while(high || cur){if(cur==0){sum += high * digit;}if(cur==1){sum += high*digit+low+1;}if(cur!=0 && cur!=1){sum += (high+1)*digit;}low += cur * digit;cur = high % 10;high /= 10;digit *= 10;}return sum;} };

    復雜度分析

    時間復雜度 O(logn): 循環(huán)內(nèi)的計算操作使用 O(1) 時間;循環(huán)次數(shù)為數(shù)字 n 的位數(shù),即 log10n,因此循環(huán)使用 O(logn) 時間。

    空間復雜度 O(1) : 幾個變量使用常數(shù)大小的額外空間。

    總結(jié)

    以上是生活随笔為你收集整理的求1~n这n个整数十进制表示中1出现的次数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。