数字 1 的个数

123 阅读1分钟

image.png

枚举每一数位上的 1 的个数

  1. for 循环从个位数上的 1 的个数开始累加答案
  2. (n/(mulk*10))*mulk 表示有多少个完整的循环,
  3. 后者则是表示不完整的那个循环中有多少个当前位数的 1 的个数
func countDigitOne(n int) (ans int) {
    // mulk 表示 10^k
    // 在下面的代码中,可以发现 k 并没有被直接使用到(都是使用 10^k)
    // 但为了让代码看起来更加直观,这里保留了 k
    for k, mulk := 0, 1; n >= mulk; k++ {
        ans += (n/(mulk*10))*mulk + min(max(n%(mulk*10)-mulk+1, 0), mulk)
        mulk *= 10
    }
    return
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}