JZ44 数字序列中某一位的数字(Java版)

描述

数字以 0123456789101112131415... 的格式作为一个字符序列,在这个序列中第 2 位(从下标 0 开始计算)是 2 ,第 10 位是 1 ,第 13 位是 1 ,以此类题,请你输出第 n 位对应的数字。

示例1

输入:0

返回值:0

示例2

输入:2

返回值:2

示例3

输入:10

返回值:1

示例4

输入:13

返回值:1

第一种解法

思路:数学

先观察数字规律

小于10,1~9,9个数字,9位

小于100,10~99,90个数字,180位

小于1000,100~999,900个数字,2700位

各个区间的下限上限是[0,10),[10, 100),[100,1000)...位数是1,2,3...,判断第n位数字对应的位数,具体代码如下

public int findNthDigit (int n) {
        if(n < 0){
            return 0;
        }
        //找到第n位数字的大致区间
        long i = 1;
        long count = 9;
        long j = 1;
        while (n > count){
            n = (int) (n - count);
            i *=10;
            j++;
            count = i*9*j;
        }
        //得出具体数字
        String num = (i + (n - 1)/j)+"";
        //求位置
        int index = (int) ((n-1) % j);
        return num.charAt(index) - '0';
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值