《劍指offer》第四十三題(從1到n整數中1出現的次數)

// 面試題43:從1到n整數中1出現的次數
// 題目:輸入一個整數n,求從1到n這n個整數的十進制表示中1出現的次數。例如
// 輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。

#include <iostream>
#include <cstring>
#include <cstdlib>// ====================方法一====================
//逐個判斷,時間復雜度為O(nlogn),不好
int NumberOf1(unsigned int n);int NumberOf1Between1AndN_Solution1(unsigned int n)
{int number = 0;for (unsigned int i = 1; i <= n; ++i)number += NumberOf1(i);return number;
}int NumberOf1(unsigned int n)
{int number = 0;while (n){if (n % 10 == 1)number++;n = n / 10;}return number;
}// ====================方法二====================
int NumberOf1(const char* strN);
int PowerBase10(unsigned int n);int NumberOf1Between1AndN_Solution2(int n)//把數字換成字符串,方便處理
{if (n <= 0)return 0;char strN[50];sprintf(strN, "%d", n);//格式化輸出成字符串return NumberOf1(strN);
}int NumberOf1(const char* strN)
{if (!strN || *strN < '0' || *strN > '9' || *strN == '\0')return 0;int first = *strN - '0';//第一位的最大值unsigned int length = static_cast<unsigned int>(strlen(strN));//強制轉換符if (length == 1 && first == 0)//邊界特殊情況return 0;if (length == 1 && first > 0)return 1;// 假設strN是"21345"//先計算第一種情況,第一位為1的個數// numFirstDigit是數字10000-19999的第一個位中1的數目int numFirstDigit = 0;if (first > 1)numFirstDigit = PowerBase10(length - 1);else if (first == 1)numFirstDigit = atoi(strN + 1) + 1;//若在1xx的情況,個數不到PowerBase10(length - 1),atoi是字符串轉整數//第二種情況,非第一位為1的個數// numOtherDigits是01346-21345除了第一位之外的數位中1的數目int numOtherDigits = first * (length - 1) * PowerBase10(length - 2);//第一位可能性有first個,第二項表示選取除了第一位的任一位為1,剩下的有10種可能// numRecursive是1-1345中1的數目,使用迭代處理int numRecursive = NumberOf1(strN + 1);return numFirstDigit + numOtherDigits + numRecursive;
}int PowerBase10(unsigned int n)//10的n次方
{int result = 1;for (unsigned int i = 0; i < n; ++i)result *= 10;return result;
}// ====================測試代碼====================
void Test(const char* testName, int n, int expected)
{if (testName != nullptr)printf("%s begins: \n", testName);if (NumberOf1Between1AndN_Solution1(n) == expected)printf("Solution1 passed.\n");elseprintf("Solution1 failed.\n");if (NumberOf1Between1AndN_Solution2(n) == expected)printf("Solution2 passed.\n");elseprintf("Solution2 failed.\n");printf("\n");
}void Test()
{Test("Test1", 1, 1);Test("Test2", 5, 1);Test("Test3", 10, 2);Test("Test4", 55, 16);Test("Test5", 99, 20);Test("Test6", 10000, 4001);Test("Test7", 21345, 18821);Test("Test8", 0, 0);
}int main(int argc, char* argv[])
{Test();system("pause");return 0;
}

?

轉載于:https://www.cnblogs.com/CJT-blog/p/10522116.html

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

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

相關文章

回調函數

又稱callback函數。意思是指&#xff1a;在你的程序中&#xff0c;被windows系統調用的函數。 這些函數雖然由你設計&#xff0c;但是永遠不會也不該被你調用&#xff0c;它們是為windows系統準備的。 窗口函數設計為callback形式&#xff0c;才能開放出一個接口給操作系統調用…

固態硬盤Ghost安裝Windows 10無法引導的問題

機器配置如下&#xff1a; 電腦型號 技嘉 B360M POWER 臺式電腦操作系統 Windows 10 64位 ( DirectX 12 )處理器 英特爾 Core i7-8700 3.20GHz 六核主板 技嘉 B360M POWER ( 英特爾 PCI 標準主機 CPU 橋 - CannonLake - A3…

Linux shell 內部命令與外部命令有什么區別以及怎么辨別

內部命令實際上是shell程序的一部分&#xff0c;其中包含的是一些比較簡單的linux系統命令&#xff0c;這些命令由shell程序識別并在shell程序內部完成運行&#xff0c;通常在linux系統加載運行時shell就被加載并駐留在系統內存中。內部命令是寫在bashy源碼里面的&#xff0c;其…

[轉]矩陣分解在推薦系統中的應用

矩陣分解是最近幾年比較火的算法&#xff0c;經過kddcup和netflix比賽的多人多次檢驗&#xff0c;矩陣分解可以帶來更好的結果&#xff0c;而且可以充分地考慮各種因素的影響&#xff0c;有非常好的擴展性&#xff0c;因為要考慮多種因素的綜合作用&#xff0c;往往需要構造cos…

iPhone 系統刷機

1. 下載好固件(愛思 或者 pp助手) e.g. http://jailbreak.25pp.com/gujian/ 2. 將電腦與手機連接上&#xff0c;彈出iTunes軟件即可 3. 長按手機電源鍵 關閉手機 4. 按住電源健&#xff0c;出現屏幕亮出現蘋果標志后再按住Home健 5. 屏幕黑屏時松開電源健&#xff0c;繼續按照H…

hdu4044

題意&#xff1a;給你一顆樹有n個節點&#xff0c;樹的根節點為1&#xff0c;表示為敵人的基地&#xff0c;其他葉子節點為你的基地&#xff0c;你一開始有m元&#xff0c;給你每個節點可以建造的塔的數量和塔的價格和可以照成的傷害&#xff0c;每個節點至多建立一座塔。敵人的…

RS100項目進展更新

1. 添加手機界面訪問網頁&#xff0c;畢竟PDA的屏幕大小和PC機大小不一致&#xff0c;完成了一自適應網頁&#xff0c;便于在手機上觀看實時畫面&#xff1b; 2. 此項目為一個遠程視頻監控遠程開關項目&#xff0c;遠程PC機或者手機能操作到監控端的開關&#xff0c;所以在遠程…

python os操作

1 # 常用的文件管理操作2 # https://www.cnblogs.com/dkblog/archive/2011/03/25/1995537.html3 import os4 import shutil5 6 # 切換工作目錄,默認是在當前目錄下7 # os.chdir("xx")8 9 # 當前的工作目錄 D:\pythonworkspace\py_base\cn\tele\io 10 print(os.getcw…

洛谷模板,樹狀數組二 差分

題目鏈接&#xff1a;https://www.luogu.org/problemnew/show/P3368 先介紹下差分&#xff1a; 設數組a[]{1,6,8,5,10}&#xff0c;那么差分數組b[]{1,5,2,-3,5} 也就是說b[i]a[i]-a[i-1];(a[0]0;)&#xff0c;那么a[i]b[1]....b[i];(這個很好證的)。 假如區間[2,4]都加上2的話…

KMS安裝后激活機器

slmgr /skms 192.168.26.82 slmgr /ato轉載于:https://www.cnblogs.com/EllieSoft/p/3410320.html

Java內存模型深度解析:總結

處理器內存模型 順序一致性內存模型是一個理論參考模型&#xff0c;JMM和處理器內存模型在設計時通常會把順序一致性內存模型作為參照。JMM和處理器內存模型在設計時會對順序一致性模型做一些放松&#xff0c;因為如果完全按照順序一致性模型來實現處理器和JMM&#xff0c;那么…

sourcetree,創建工作流報錯:Fatal: Not a gitflow-enabled repo yet. Please run 'git flow init' first.-》解決辦法...

1、打開項目下.git/config文件&#xff0c;或者如下圖操作&#xff1a; 2、打開config文件以后&#xff0c;刪除所有 [gitflow *條目并保存文件 3、關閉并重新打開sourcetree 4、倉庫-》Git 工作流-》初始化倉庫即可轉載于:https://www.cnblogs.com/yxfeng/p/10536955.html

關于a標簽的href屬性的注意事項

今天在做一個lightbox效果的時候出現了一個問題。 當往下滾動再點擊按鈕出現lightbox的時候&#xff0c;lightbox的遮罩層不能鋪滿&#xff08;即滾動高度處不能鋪上&#xff09;&#xff0c;如下圖所示。原因是提交按鈕使用的是a標簽&#xff0c;當給a標簽寫上href屬性的時候&…

爬蟲開發4.三種數據解析方式

數據解析三種方式引言&#xff1a;回顧requests實現數據爬取的流程 指定url基于requests模塊發起請求獲取響應對象中的數據進行持久化存儲其實&#xff0c;在上述流程中還需要較為重要的一步&#xff0c;就是在持久化存儲之前需要進行指定數據解析。因為大多數情況下的需求&…

在mac上安裝gitlab

參考鏈接&#xff1a; https://www.cnblogs.com/floodwater/p/10138265.html 注意事項&#xff1a; 在安裝gitlab-ce時&#xff0c;配置hostname域名后&#xff0c;通過域名訪問gitlab時&#xff0c;需要配置本機hosts文件&#xff0c;不然不能訪問 本地hosts文件中配置后 就可…

org.apache.maven.archiver.MavenArchiver.getManifest錯誤

org.apache.maven.archiver.MavenArchiver.getManifest錯誤 網上普遍要add&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c; 正解&#xff1a; 接到一個新需求&#xff0c;開始搭建項目時遇到了如標題錯誤。查詢網絡普遍得到是更新maven插件版本。 之前已安裝過此…

d3.js 入門指南

說到數據可視化&#xff0c;我們會行到很多優秀的框架&#xff0c;像echarts、highcharts&#xff0c;這些框架很優雅&#xff0c;健壯&#xff0c;能滿足我們對可視化的大部分需求&#xff0c;但是缺點也很明顯&#xff0c;就是這些框架幾乎是不可定制化的&#xff0c;當遇到特…

【LeetCode】200. 島嶼的個數

題目 給定一個由 1&#xff08;陸地&#xff09;和 0&#xff08;水&#xff09;組成的的二維網格&#xff0c;計算島嶼的數量。一個島被水包圍&#xff0c;并且它是通過水平方向或垂直方向上相鄰的陸地連接而成的。你可以假設網格的四個邊均被水包圍。 示例 1:輸入: 11110 110…

AI 模擬退火算法

模擬退火算法轉載于:https://www.cnblogs.com/yangwenhuan/p/10548171.html

keep用法

keep 是英語中用法靈活的動詞之一&#xff0c;下面筆者就其用法歸納如下&#xff1a; 一、用作系動詞&#xff0c;意為“保持&#xff08;某種狀態&#xff09;”&#xff0c;其后常接形容詞作表語。如&#xff1a; Please keep quiet / silent! 請保持安靜&#xff01; Aft…