leetcode 233題1的個數
阿新 • • 發佈:2021-12-15
class Solution { public: long long dp[20]; long long miu[20]; int nums[20]; int countDigitOne(int n) { int len = 0; memset(dp,0,sizeof(dp)); memset(miu,0,sizeof(miu)); int x = n; int num = 0; while(x > 0) { nums[num] = x % 10; num++; x = x / 10; } // dp[0] = 0; dp[1] = 1; miu[0] = 0; miu[1] = 1; for(int i=2;i<11;i++) { miu[i] = miu[i-1] * 10ll; } for(int i=1;i<=11;i++) { dp[i] = dp[i-1] * 10ll + miu[i]; } // for(int i=1;i<=10;i++) { // cout << dp[i] << " " << miu[i] << "\n"; // } int ans = 0; //1234 // int tmp = n; for(int i=num-1;i>=0;i--){ // cout << nums[i] << " " << dp[i] << " " << miu[i] << "\n"; ans += dp[i] * nums[i]; if(nums[i] > 1){ ans += (miu[i+1]); tmp -= miu[i+1] * nums[i]; } else if(nums[i] == 1){ tmp -= miu[i+1] * nums[i]; ans += tmp + 1; } } return ans; } };