LeetCode 233. 数字 1 的个数
题目描述
思路分析
解法一:数位统计(推荐)
核心思路:
- 逐位统计
1的出现次数。- 对每一位
factor,计算higher、cur、lower。- 根据
cur值累加贡献:
cur == 0:higher * factorcur == 1:higher * factor + lower + 1cur > 1:(higher + 1) * factor
复杂度分析:
- 时间复杂度:O(log n),其中 n 表示数字大小。
- 空间复杂度:O(1)。
// 数位统计 1 的出现次数
class Solution {
public int countDigitOne(int n) {
long factor = 1;
long res = 0;
while (n / factor != 0) {
long lower = n % factor;
long cur = (n / factor) % 10;
long higher = n / (factor * 10);
if (cur == 0) {
res += higher * factor;
} else if (cur == 1) {
res += higher * factor + lower + 1;
} else {
res += (higher + 1) * factor;
}
factor *= 10;
}
return (int) res;
}
}
// 数位统计 1 的出现次数
func countDigitOne(n int) int {
factor := 1
res := 0
for n/factor != 0 {
lower := n % factor
cur := (n / factor) % 10
higher := n / (factor * 10)
if cur == 0 {
res += higher * factor
} else if cur == 1 {
res += higher*factor + lower + 1
} else {
res += (higher + 1) * factor
}
factor *= 10
}
return res
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 400. 第 N 位数字 | 中等 | 数位统计 |
| 357. 统计各位数字都不同的数字个数 | 中等 | 数位 DP |
| 902. 最大为 N 的数字组合 | 困难 | 数位 DP |
| 1012. 至少有 1 位重复的数字 | 困难 | 数位 DP |
| 600. 不含连续 1 的非负整数 | 困难 | 数位 DP |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!