问题陈述:
给定一个整数n,统计所有非负整数中数字1出现的总次数。
例如: 给定n = 13, 返回6,因为数字1出现在以下数字中:1、10、11、12、13。
高效解决方案:
int countDigitOne(int n) {
if (n <= 0) return 0;
int q = n, x = 1, ans = 0;
do {
int digit = q % 10;
q /= 10;
ans += q * x;
if (digit == 1) ans += n % x + 1;
if (digit > 1) ans += x;
x *= 10;
} while (q > 0);
return ans;
}
我的问题:
我在一个论坛中找到了解决方案,但是我很难理解这个解决方案。我知道这是一个非常简单的问题,但请您详细解释一下。
谢谢