剑指 Offer 44 数字序列中某一位的数字

题目:序列化的数字,0123456789101112131415…。0对应第0位,9对应第9位,但是第10位为1。给你一个n,让你求第n位的数字是几?(0~9)

public int findNthDigit(int n)

思路找规律题。
1.先根据n来找到该数字的位数
(1位数,1到9,有9位。2位数,10到99,有180位=9乘10乘2。3位数,100到999,有2700位=9乘100乘3。用interval-1表示该n与start=1/10/100…的距离,digit表示所求位数。

可以使用while当temp小于count位数时才结束循环(不需要当temp为0时结束,不好实现)。但是这个没有考虑到单数位,需要前面再考虑一下。在while里完成所有变量的更新。)

2.再找到该数字是几
(用interval-1再除digit求出与start数字之间的距离)
3.再确定所要的位是这个数字的第几位
(用interval-1再%digit来映射到start的位,来得到)

注意:start每次乘10,会超出int范围,所以由start得到的变量都要写为long,全部都写为long就好
最后用了化为string里面取char,基本操作要可以写出来。

全程可以举n=15的例子,结果为2。来作为参考。

public int findNthDigit(int n) {
        long temp = n,interval = 0,count = 9,start = 1,digit = 1;
        //处理单位数
        if(temp <= count) return (int)temp;
        /*
        只要temp小于count的时候就停下来(两个都在变化)
        没有考虑单数位的情况,所以上面才去处理单数位。

        log10n,因为是算的n的位数
         */
        while(temp > count){
            interval = temp - count;
            temp -= count;
            //所有的变化都写在while里
            start *= 10;
            count = 9 * start * (digit + 1);
            digit++;
        }
        long num = start + (interval - 1) / digit;
        String tempStr = String.valueOf(num);
        char res = tempStr.charAt((int)((interval - 1) % digit));
        return res - '0';
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值