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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

《剑指offer》第四十三题(从1到n整数中1出现的次数)

發布時間:2023/12/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《剑指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

總結

以上是生活随笔為你收集整理的《剑指offer》第四十三题(从1到n整数中1出现的次数)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。