解题记录 LeetCode 数字 1 的个数 数学规律题

题目链接: https://leetcode-cn.com/problems/number-of-digit-one/
题意: 求小于等于 n 的数中1出现的个数
思路: 暴力超时, n 范围 2 * 1e9, 所以需要找规律, 易发现个位上每增加十个数, 个位就会出现一次1, 十位上每增加100个数会出现10次1, 以此类推, 但是由于 n 不是一个能被10整除的数, 所以还有末尾细节需要处理

代码:

class Solution {
    public int countDigitOne(int n) {
       int ans = 0;
       for(long i = 1; i <= n; i *= 10) {
           ans += ((n / (i * 10)) * i + Math.min(i, Math.max(0, n % (i * 10) - i + 1)));
       }
       return ans;
    }
}

总结: 可以拓展求 5 出现的个数等等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值