《劍指offer》-整數中1出現的次數

題目描述
求出1~13的整數中1出現的次數,并算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對于后面問題他就沒轍了。ACMer希望你們幫幫他,并把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。

直接暴力可以過。但是不優美。
嘗試推導公式,思路是遞歸求解,發現假如n都是999,99999這種全9的數字會很好處理:f(n)=g(t)*f(h(n)), 其中t表示n的第一個位,h(n)表示n去掉第一位,g(t)要特別考慮1的情況。

但是n很可能連一個9都沒有。沒關系,那就把n切分成兩部分,一部分是能用99999這種處理的,另一部分是再單獨計算的。

而其實這兩個部分是可以合并的,99999的情況是后者的特例而已。

利用數字特點和規律,計算每一位上1出現的次數:
例如百位上1出現次數,數值n在百位上的值是curNum則:

if(curNum==0)
1出現的次數等于比百位更高位數100。例如n=1023,高位數就是1,百位上出現1的次數是1100;

if(curNum==1)
1出現的次數等于比百位更高位數100,再加上低位上的數,再加1。例如n=1123,高位數就是1,低位數是23,百位上出現1的次數是1100+23+1;

if(curNum>1)
1出現的次數等于比百位更(高位數+1)100,例如n=1223,高位數就是1,次數百位上出現1的次數是(1+1)100;

而其實這種策略是適用于各個位的,不僅僅是在百位上。那么直接上碼吧:

class Solution {
public:int NumberOf1Between1AndN_Solution(int n){int count=0;int factor=1;while(n/factor!=0){int curNum = (n/factor)%10;int lowNum = n%factor;int highNum = n/(factor*10);if(curNum==0){count += factor*highNum;}else if(curNum==1){count += factor*highNum + lowNum + 1;}else{count += factor*(highNum + 1);}factor *= 10;}return count;}
};

參考:[https://troywu0.gitbooks.io/interview/content/整數中出現1的次數(從1到n整數中1出現的次數).html]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259470.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259470.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259470.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

This is Me!——回顧第一個項目的前前后后

今天終于把論文敲完了,一路走來,頗多感想。遂寫下以下諸多文字,以饗讀者。 在說這個項目之前,先簡單介紹一下我的經歷。我叫王財勇,家是山西的,2009年至2013年在新疆大學就讀數學專業,也許有人…

從零開始學JavaScript三(變量)

一、變量 ECMAscript變量是松散型變量,所謂松散型變量,就是變量名稱可以保存任何類型的數據,每個變量僅僅是一個用于保存值的占位符。 定義變量時要使用var操作符 如: var message; /*定義一個名為message的變量,該變量…

DES加密過程例解

DES加密算法是最被廣泛使用的對稱加密算法,通過示例來演示DES、TribleDES(3Key) DES-ECB: 按8字節為單位進行加密,不足8字節補0key: 1111111111111111indata: 2222222222222222 OutData: 950973182317F8…

linux在雙系統中消失了,雙系統重新安裝windows后,ubuntu選項消失

1、首先用LiveCD進入ubuntu2、打開終端,,輸入:fdisk -l 查看自己linux的分區情況,我的分了4個區,swap,boot,/,home,對應的分別是:/dev/sda9 swap…

Cydia源局域網化

2019獨角獸企業重金招聘Python工程師標準>>> 步驟 在網址根目錄創建文件夾cydia,把你的deb文件放到 cydia/debs/ 文件夾下。在終端cd進入cydia文件夾輸入命令:dpkg-scanpackages debs /dev/null > Packages輸入命令:tar zcvf P…

前綴++ 后綴++ 運算符重載

下面例子程序中 const Fraction operator (int) 中 int不過是個啞元(dummy),是永遠用不上的 它只是用來判斷++是prefix 還是 postfix 記住,如果有啞元,則是postfix,否則&#xff0c…

固定資產調整對資產折舊的影響

固定資產折舊計提方法 一、原值增加: 1、已攤銷資產: 攤銷調整時間設在當期:(1078135) 在進行原值增加后,攤銷日期不變時,折舊在當月體現。 每月新增月折舊調增金額*(1-殘值率)/(折舊年限*12-已提折舊月份的個數) 例&a…

linux系統中 庫分為靜態庫和,Linux系統靜態庫與共享庫

8種機械鍵盤軸體對比本人程序員,要買一個寫代碼的鍵盤,請問紅軸和茶軸怎么選?This article mainly introduces the statics library and shared library on Linux and has done some experiments for better comprehension.Static library&am…

軟件工程概論作業01

軟件工程作業01 寫一個能自動生成三十道小學四則運算題目的 “軟件”,要求:除了整數以外,還要支持真分數的四則運算(需要驗證結果的正確性)、題目避免重復、可定制出題的數量。 思路:隨機生成兩個數進行計算…

成員指針運算符 .* 和 -*

轉載: http://www.groad.net/bbs/thread-5548-1-1.html 有一種特殊的指針叫做成員指針,它們通常指向一個類的成員,而不是對象中成員的特定實例。 成員指針并不是真正的指針,它只是成員在對象中的偏移量,它們分別是&am…

捕捉Entity framework 6的詳細異常提示

采用 try{}catch (Exception e){throw;}不能捕捉到詳細異常提示, e.message的內容為"Validation failed for one or more entities. See EntityValidationErrors property for more details." 如果需要獲取詳細的異常提示,采用 1 try2 {3 return…

8.16——熟悉安裝linux系統

一、linux的版本——CentOS CentOS(Community ENTerprise Operating System)是Linux發行版之一,它是來自于Red Hat Enterprise Linux依照開放源代碼規定釋出的源代碼所編譯而成。由于出自同樣的源代碼,因此有些要求高度穩定性的服…

linux中設置默認權限的命令,Linux默認權限掩碼

Linux教程Linux教程:http://www.fdlly.com/m/linux文章目錄默認權限掩碼設置權限掩碼以文字的方式設置權限掩碼查看系統當前的權限掩碼默認權限掩碼當我們創建文件或目錄時,系統會自動根據權限掩碼來生成預設權限;默認情況下的umask值是022(可…

percona-toolkit工具包安裝

percona-toolkit工具包同percona-xtrabackup一樣都是用Perl寫的工具包,percona-toolkit工具包是一組高級的管理mysql的工具包集,可以用來執行各種通過手工執行非常復雜和麻煩的mysql和系統任務,在生產環境中能極大的提高效率,安裝…

C++允許重載的運算符和不允許重載的運算符

C中絕大部分的運算符允許重載&#xff0c;具體規定見表10.1。 表10.1 C允許重載的運算符雙目算術運算符 (加)&#xff0c;-(減)&#xff0c;*(乘)&#xff0c;/(除)&#xff0c;% (取模) 關系運算符 (等于)&#xff0c;! (不等于)&#xff0c;< (小于)&#xff0c;> (大…

Google Mesa概覽

Google Mesa的文章&#xff1a;https://research.google.com/pubs/pub42851.html https://gigaom.com/2014/08/07/google-shows-off-mesa-a-super-fast-data-warehouse-that-runs-across-data-centers/ 為什么未來的Hadoop是實時的&#xff1a; https://gigaom.com/2013/03/0…

C++數組參數應用方式探討(轉)

對于經驗豐富的編程人員來說&#xff0c;C編程語言應該是他們經常使用于程序開發的一種實用性語言。那么&#xff0c;在C中&#xff0c;C數組參數永遠不會按值傳遞。它是傳遞第一個元素&#xff08;準確地說是第0個&#xff09;的指針。 例如&#xff0c;如下聲明&#xff1a; …

一篇關于兼容問題的基礎總結

1.添加兼容文件(以 es5-shim 為例) 方法一&#xff1a; <script src"https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.7/es5-shim.min.js"></script>在你的開發中&#xff0c;在需要為他做兼容的文件引入改文件 方法二(以模塊引入)&#xff1a; 在…

假如生活欺騙了你

假如生活欺騙了你&#xff0c; 不要悲傷&#xff0c;不要心急&#xff01; 憂郁的日子里需要鎮靜&#xff1a; 相信吧&#xff0c;快樂的日子將會降臨。 心兒永遠向往著未來&#xff1b; 現在卻常是憂郁&#xff0c; 一切都將會過去&#xff1b; 而那過去了的&#xff0c…

linux編譯mmc驅動,Embeded linux之MMC驅動

一、注冊平臺設備platform_device_register(&usr_mci_device);二、填寫平臺設備結構體static struct platform_device usr_mci_device {.name "xxx",.id 0,.dev {.release usr_mci_platdev_release,.dma_mask &usr_mmc_dmama…