下次手撕不出来就这么说:
没有什么好的思路,可以通过基本的实现,一个for循环遍历者n个数,然后通过取余和除10,判断每个数中1的个数,最后返回结果。 可以给点提示吗?
…
稍微思考一下,如果还是没有思路:就说:
我现在没有什么思路,可以换一道题吗?
这样总比 最后用最差的方法,遍历出结果强吧?
前面问题都打上来了
最后出了个困难题:
从1-n整数中一的个数
思路:
代码:
注意:虽然是从个位开始统计,但是: 算式中第一项是 一共有多少个这样的个位组合,所以 一开始 n应该除以 1*10 , 而不应该直接除以1
class Solution {
public int countDigitOne(int n) {
// mulk 表示 10^k
// 在下面的代码中,可以发现 k 并没有被直接使用到(都是使用 10^k)
// 但为了让代码看起来更加直观,这里保留了 k
long mulk = 1;
int ans = 0;
for (int k = 0; n >= mulk; ++k) {
ans += (n / (mulk * 10)) * mulk + Math.min(Math.max(n % (mulk * 10) - mulk + 1, 0), mulk);
mulk *= 10;
}
return ans;
}
}