44、数字序列中某一位的数字

数字序列中某一位的数字

题目描述

​ 数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。

思路分析

​ 最常规的做法:从0开始对每个数字求位数个数并累加,直至n位于累加的范围内,由此再具体求第n位对应的数字。常规做法是可行的,可其效率过低,应该有更好的做法。可以先考虑找规律:一位数0~9有10个,两位数10~99有2*90个(即180个),三位数100~999有3*900(即2700个)……以此类推:一个n位数有n*9*10^(n-1)个。至此我们可以通过此规律确定题目中的n是几位数,此外可以确定到n具体位于哪个数字上的第几位。例:当n为1001时,1001>10,则即求10为始端的第991位对应的数字,又991>180,则即求以100为始端的第881位对应的数字,再者811<2700,确定对应数字为3位数。由于811=3×270+1,则结果为以100开始的第270个数字即370的中间一位,也就是7.

代码如下:

public int getGitNum(int index){
    if(index<0)return -1;
	int count=10,git=1;
    index-=count;
    while(index>=0){
        git++;
        count=(int)(9*Math.pow(10,git-1)*git);
        index-=count;
    }
    int left=index+count;
    int num=(int)Math.pow(10,git-1)+left/git;
    if(git==1)num--;
    String strNum=Integer.toString(num);
    return strNum.charAt(left%git)-'0';
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值