直接看代码注释,感觉解释得挺清楚啦
C++ 代码
class Solution {
public:
/*
按位来进行计算,分为中间位,前位,和后位,分情况进行计算,循环中间位的值
以ab c def为例,中间位为c
(1) c = 1 则个数 += (ab - 1) * 1000(def位数)
(2) 前位取ab c = 0,则不加
c = 1 则个数 += def + 1
c > 1 则个数 += 1000(def位数)
自己可举详细例子进行尝试 例如12
(1) 中间位 = 1 前位为0,后位为2 则个数 += 2 + 1 = 3 这里 c = 1的情况
(2)中间位 = 2 前位为1,后位为0 则个数 += 1 + 1 = 2 这里(ab - 1) = 0 一种情况 还有一种c > 1 的情况
总数即为 5
*/
int numberOf1Between1AndN_Solution(int n) {
if(!n) return 0;
vector<int> number;
while(n) number.push_back(n%10),n /= 10;
int res;
for(int i = number.size() - 1; i >= 0; i--){
auto left = 0, right = 0, t = 1;
for(int j = number.size() - 1; j > i; j--) left = left * 10 + number[j];
for(int j = i - 1; j >= 0; j--) right = right * 10 + number[j], t *= 10;
res += left * t;
if(number[i] == 1) res += right + 1;
else if(number[i] > 1) res += t;
//cout << left << " " << right << " " << t << " " << res << endl;
}
return res;
}
};