LeetCode 233. 数字 1 的个数

题目描述

233. 数字 1 的个数

思路分析

解法一:数位统计(推荐)

核心思路

  • 逐位统计 1 的出现次数。
  • 对每一位 factor,计算 highercurlower
  • 根据 cur 值累加贡献:
    • cur == 0higher * factor
    • cur == 1higher * factor + lower + 1
    • cur > 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
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/56802046
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!