233. 數字 1 的個數
來源: LeetCode 233. 數字 1 的個數
題目描述
233. 數字 1 的個數
給定一個整數 n,計算所有小於等於 n 的非負整數中數字 1 出現的個數。
示例:
輸入: 13
輸出: 6
解釋: 數字 1 出現在以下數字中: 1, 10, 11, 12, 13 。
思路分析
代碼
class Solution {
public:
int countDigitOne(int n) {
if(n == 0) return 0;
typedef pair<long long, long long> info;
vector<info> digit;
int x = n; long long y=1;
while(x){
int z = x%10;
digit.push_back(make_pair(z, z*y));
if(digit.size() > 1) digit.back().second += digit[digit.size() - 2].second;
x/=10;
y *= 10;
}
vector<info> dp(digit.size(), make_pair(1,1));
int res = digit[0].first > 0 ? 1 : 0;
for(int i=1; i<digit.size(); ++i){
dp[i].first = dp[i-1].first * 10;
dp[i].second = dp[i-1].second * 10;
dp[i].first += dp[i].second;
res += digit[i].first > 0 ? dp[i-1].first*digit[i].first : 0;
res += digit[i].first > 1 ? dp[i].second : digit[i].first == 1 ? digit[i-1].second+1:0;
}
return res;
}
};
算法分析
代碼改進
相似擴展
歸納總結