算法1
$O(10*logn)$
每次对当前数 进行分叉讨论,有的情况可以直接推出公式;
另外一个封顶继续for
C++ 代码
class Solution {
public:
int numberOf1Between1AndN_Solution(int n) {
vector<long long> nums;
while (n) {
nums.push_back(n % 10);
n /= 10;
}
// for (int x: nums) {
// cout << x << endl;
// }
long long ans = 0;
long long preone = 0;
for (int i = nums.size() - 1; i >= 0; -- i) {
for (int j = 0; j < nums[i]; ++j) {
if (j == 1) {
ans += (preone + 1) * 1LL * pow(10, i);
if (i - 1 >= 0) {
ans += i * pow(10, i - 1);
}
}
else {
ans += preone * 1LL * pow(10, i);
if (i - 1 >= 0) {
ans += i * 1LL * pow(10, i - 1);
}
}
}
preone += nums[i] == 1 ? 1 : 0;
//cout << "preone " << preone << endl;
}
ans += preone;
return ans;
}
};