整数 1 到 n 中 1 出现的次数

整数 1 到 n 中 1 出现的次数

题目描述
这个题目说的是,给你一个整数 n,你要计算出 1 到 n 这 n 个整数中,数字 1 出现的次数。

比如说,给你的整数 n 等于 12:

n = 12

1 到 12 中包含数字 1 的整数有:

1, 10, 11, 12

这里面数字 1 出现了 5 次,因此你要返回 5。

代码

public class AlgoCasts {

  // Time: O(n*log10(n)), Space: O(1)
  public int countDigitOneBruteForce(int n) {
    if (n < 1) return 0;
    int count = 0;
    for (int i = 1; i <= n; ++i) {
      int num = i;
      while (num != 0) {
        if (num % 10 == 1) ++count;
        num = num / 10;
      }
    }
    return count;
  }

  // Time: O(log10(n)), Space: O(1)
  public int countDigitOneMath(int n) {
    if (n < 1) return 0;
    long count = 0, factor = 1;
    while (n / factor != 0) {
      long digit = (n / factor) % 10;
      long high = n / (10 * factor);
      if (digit == 0) {
        count += high * factor;
      } else if (digit == 1) {
        count += high * factor;
        count += (n % factor) + 1;
      } else {
        count += (high + 1) * factor;
      }
      factor = factor * 10;
    }
    return (int)count;
  }

}

 上一篇
求和为给定值的组合 求和为给定值的组合
求和为给定值的组合题目描述这个题目说的是,给你一个正整数数组,数组中不包含重复元素,同时给你一个正整数目标值,你要找到数组中和为目标值的所有组合。另外,数组中每个元素都可以使用无限多次,并且答案中不能包含重复组合。 比如说,给你的数组是:
2019-02-17
下一篇 
第 n 个斐波那契数 第 n 个斐波那契数
第 n 个斐波那契数题目描述这个题目说的是,给你一个非负整数 n,你要写一个函数返回第 n 个斐波那契数。其中斐波那契数列最开始的两项是 0 和 1,后面任意一项都是它前面两个数字之和。 比如说,你写的函数是 f,那么就有: f(0) =
2019-02-17
  目录