数字序列中的某一位数字 - java

分析:
--------------------------------------------------拆成的索引数 ----------------不拆的话

  1. 一位数字(0-9)------------------------1 * 10个 ------------- ----------10个
  2. 两位数字(10-99 ) --------------2 * 9 * 10个 -------------------------90个
  3. 三位数字(100-999)-------------3 * 9 * 100个 ----------------------900个
  4. .base位数字…------------------base * 9 * 10^(base - 1)--------9 * 10 ^(base - 1)

解题思路:

  1. 判断该索引所对应的数字是几位数 -------> base
  2. 判断该索引所对应得数字是几 -------->realNum
  3. 判断该索引是原来数字的第几位 ----------> IndexOfRealNum

代码:
1.无效检验,以及如果索引小于10,说明是一位数字直接返回

if (index < 0) {
            return -1;
   }
  if (index < 10) {
            return index;
    }

2.判断该索引所对应的数字是几位数

 index -= 10;
        int base = 2;
        while (index >= skipWidth(base)) {
            index -= skipWidth(base);
            base++;
        }
 private static int skipWidth(int base) {
        return  9 * base * (int)Math.pow(10, base - 1);
    }

3.判断该索引所对应得数字是几

 int realNum = getRealNum(index, base);
 
 private static int getRealNum(int index, int base) {
        int baseNum = (int)Math.pow(10, base - 1);  // 底数,二位底数是100,三位1000,,,
        if (index ==  0) {  
            return baseNum;
        }
         return baseNum + (index / base);
    }
  1. 判断该索引是原来数字的第几位
int indexOfRealNum = getIndexOfRealNum(index, base);
private static int getIndexOfRealNum(int index, int base) {
        return index % base;
   }

5.返回结果

return String.valueOf(realNum).charAt(indexOfNum) - '0';

完整代码:

static int getIndexOfRealNum(int index) {
        if (index < 0) {
            return -1;
        }

        if (index < 10) {
            return index;
        }

        index -= 10;
        int base = 2;
        while (index >= skipWidth(base)) {
            index -= skipWidth(base);
            base++;
        }

        int realNum = getRealNum(index, base);
        int indexOfNum = getIndexOfRealNum(index, base);

        return String.valueOf(realNum).charAt(indexOfNum) - '0';
    }

    private static int getIndexOfRealNum(int index, int base) {
        return index % base;
    }

    private static int getRealNum(int index, int base) {
        int baseNum = (int)Math.pow(10, base - 1);
        if (index == 0) {
            return baseNum;
        }
        return baseNum + (index / base);

    }

    private static int skipWidth(int base) {
        return  9 * base * (int)Math.pow(10, base - 1);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值