【LeetCode】233. 數字1的個數 結題報告 (C++)
阿新 • • 發佈:2018-11-27
原題地址:https://leetcode-cn.com/problems/number-of-digit-one/
題目描述:
給定一個整數 n,計算所有小於等於 n 的非負整數中數字 1 出現的個數。
示例:
輸入: 13
輸出: 6
解釋: 數字 1 出現在以下數字中: 1, 10, 11, 12, 13 。
解題方案:
純數學型別的題目,需要尋找規律並進行總結,過程比較繁瑣,學習網上大佬的方法:https://blog.csdn.net/kyfant/article/details/82658273?utm_source=blogxgwz8
程式碼:
class Solution { public: int GetContribution1(int nDigit){ if (nDigit == 1) return 0; int nTem = nDigit - 2; int nRes = 1; int i = 1; while(nTem -- > 0) nRes = nRes * 10 + power10(i++); return nRes; } // 10的n次冪 int power10(int n) { int nTem = n; int res = 1; while (nTem > 0) { res *= 10; nTem--; } return res; } int countDigitOne(int n) { int nRes = 0; // 定義一個數組記錄輸入的每一位 vector<int> vecNum; int nTem = n; while(nTem) { vecNum.push_back(nTem % 10); nTem /= 10; } nTem = n; while(vecNum.size() > 0) { // 當前共有幾位 int nCurWei = vecNum.size(); // 當前最高位是多少 int nHigh = vecNum.back(); // 當前最高位如果是0,則對1沒有貢獻 if (nHigh > 0) { // 貢獻的第一部分 nRes += GetContribution1(nCurWei) * nHigh; // 貢獻的第二部分 if (nHigh == 1) nRes += nTem % power10(nCurWei - 1) + 1; else nRes += power10(nCurWei - 1); // nTem表示去除最高位剩下的數 nTem %= power10(nCurWei - 1); } vecNum.pop_back(); } return nRes; } };