第n位数 Nth Digit

问题:

Find the nth digit of the infinite integer sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...

Note:
n is positive and will fit within the range of a 32-bit signed integer (n < 231).

Example 1:

Input:
3
Output:
3

Example 2:

Input:
11
Output:
0
Explanation:
The 11th digit of the sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... is a 0, which is part of the number.

解决:

【注】问题的本意是将所有的自然数看成一个字符串,输出第n位上的数是多少

① 问题的本质在于找到这个字符串中第n位上是多少。我们可以知道:

1 - 9  : 9
10 - 99 : 90 * 2
100 - 999 : 900 * 3
1000 - 9999 : 9000 * 4
... ... 

我们可以定义个变量count,初始化为9,然后每次循环扩大10倍,再用一个变量len记录当前循环区间数字的位数,另外再需要一个变量start用来记录当前循环区间的第一个数字,我们n每次循环都减去len*count(区间总位数),当n落到某一个确定的区间里了,那么(n-1)/len就是目标数字在该区间里的坐标加上start就是得到了目标数字,然后我们将目标数字start转为字符串,(n-1)%len就是所要求的目标位,最后别忘了考虑int溢出问题,我们干脆把所有变量都申请为长整型的。

例如,定义n = 1000,首先,1000-9=991,991-180=811。剩下的数为811,第1000位所在的数为100+(811-1)/3=370,第1000位的数在370中的序列号为(811-1)%3=0,所以结果为第0位上的3.

public class Solution {  //6ms
    public int findNthDigit(int n) {  
        if(n <= 0) return 0;  
        long count = 9;  
        int start = 1;  
        int len = 1;  
        while(n > len * count){  //每个区间的总位数
            n -= len * count;  
            len ++;  
            start *= 10;  
            count *= 10;  
        }  
        start += (n - 1) /l en;  
        return String.valueOf(start).charAt((n - 1) % len) -'0';  
    }  
}  

 

转载于:https://my.oschina.net/liyurong/blog/1204100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值