博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第n位数 Nth Digit
阅读量:6307 次
发布时间:2019-06-22

本文共 1224 字,大约阅读时间需要 4 分钟。

hot3.png

问题:

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:3Output:3

Example 2:

Input:11Output:0Explanation: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

你可能感兴趣的文章
Python编程语言
查看>>
十四、转到 linux
查看>>
Got error 241 'Invalid schema
查看>>
ReferenceError: event is not defined
查看>>
男人要内在美,更要外在美
查看>>
为什么要跟别人比?
查看>>
app启动白屏
查看>>
Oracle 提高查询性能(基础)
查看>>
学习知识应该像织网一样去学习——“网状学习法”
查看>>
Hadoop集群完全分布式安装
查看>>
QString,char,string之间赋值
查看>>
我的友情链接
查看>>
Nginx+mysql+php-fpm负载均衡配置实例
查看>>
shell脚本操作mysql数据库 (部份参考)
查看>>
MySql之基于ssl安全连接的主从复制
查看>>
informix的逻辑日志和物理日志分析
查看>>
VMware.Workstation Linux与windows实现文件夹共享
查看>>
ARM inlinehook小结
查看>>
wordpress admin https + nginx反向代理配置
查看>>
管理/var/spool/clientmqueue/下的大文件
查看>>