[LeetCode]Number of Digit One

很有意思的一道题,找到数学规律,从个位数一直找到最高位

比如输入13,那么在个位数上会有 13 / 10 乘以 1 个 1, 这个只是算了10之前的个位数上的1,同时还要加上10到13这一段个位数上的1,这里因为3大于1,所以加以,如果3是小于1的则不加那个一。

同理,推导到十位数,13/100为 0 个0, 然后我们判断从000 到 013这一段十位数上有多少个1, 因为13 是大于 10, 但是小于20的, 所以我们要加上 13 - 10 + 1个1

注意不要超限,题目既然都说了,那么最好可能超限的变量都用long好了

代码如下

public class Solution {
    public int countDigitOne(int n) {
        long tmp = 10;
        long result = 0;
        long N = n;
        while (tmp <= N * 10) {
            result += (N / tmp) * (tmp / 10);
            if (N % tmp >= 2 * tmp / 10) {
                result += tmp / 10;
            } else if (N % tmp >= tmp / 10) {
                result += n % tmp - tmp / 10 + 1;
            }
            tmp *= 10;
        }
        return (int)result;
    }
}

 

转载于:https://www.cnblogs.com/vision-love-programming/p/4999536.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值