LeetCode 233. Number of Digit One
题意:
Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.
For example:
Given n = 13,
Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.
思路: 按位dp。
1、先算出每个数量级的1的个数,简单dp。
2、从高位到地位处理。利用数量级和边界算出。 注意每一位上为0的情况。
时间久不刷题,手太生了。
AC代码:
class Solution { public: int countDigitOne(int n) { if(n <= 0) return 0; long long f[16] = {0}, ex[16] = {0}; long long cur = 10; f[1] = 1; ex[0] = 1; for(int i=2; i<16; i++) { ex[i-1] = ex[i-2]*10; f[i] = f[i-1]*10; f[i] += cur; cur *= 10; } long long ans = 0; vector<int>tp; int m = n; while(n) { tp.push_back(n%10); n/=10; } for(int i=tp.size()-1; i>=0; i--) { if(tp[i]> 1) { ans += tp[i]*f[i]; ans += ex[i]; } else if(tp[i] == 1) { ans += tp[i]*f[i]; ans += m%ex[i]+1; } } return ans; } };

浙公网安备 33010602011771号