leetcode No.400 第N个数字,时间beat99%,空间beat80%

/*时间1ms  beat98.92,空间beat80%
思路是:位数  数字个数(即个位数字一共9个 两位数一共90个)
       1      9
       2      90
       3      900
       ...    ...
给定一个n,先找所在的区间(如1-9,10-99...),然后求出它是所在的区间的第多少个数字,再算出是这个数字的第几位。找区间按照公式n=n-9*1-90*2-900*3...-9*10^(i-1)*i,
求出的i指它在i位数的区间内,n为该区间第n个数字,假设公式得到的n=4,i=2,那么说明是两位数,4/i=2,说明是第2个数字,即11,4%i=0,说明是第二个数字的最后一位,即1。
再假设共识得到n=25,i=3,说明是三位数,25/3=8,25%3=1,说明三位数中第8+1个数字,是这个数字的第1位,即是108中的1
*/
class Solution {
    public int findNthDigit(int n) {
       if(n<10) return n;
        int i;//记录结果所在数字的区间是几位数
        for(i=1;n>9*i*Math.pow(10,i-1);++i){
            n-=9*i*Math.pow(10,i-1);
        }
        int index=n/i;//某个区间第index个数字
        if(index==0) index=1;//不会出现第0个数字,起码从第一个数字起
        int bit=n%i;//第index个数的第bit位,接下来找出这个位数
        int number=(int)Math.pow(10,i-1)+index-1; //number为一个具体的i位数
        if(bit==0)//说明在这个数字的最后一位
            return number%10;
        else return getIndexBit(number+1,bit,i);//bit不为0 时,数字要再加1
    }
    private int getIndexBit(int number,int bit,int i){ //获取数字number的第bit位数
        int a=(int)(number/Math.pow(10,i-bit));
        return a%10;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值