1. 程式人生 > >【LeetCode】233. 數字1的個數 結題報告 (C++)

【LeetCode】233. 數字1的個數 結題報告 (C++)

原題地址: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;
	}
};