深圳专业做网站排名多少钱南宁百度推广代理商
参考资料
剑指 Offer 44. 数字序列中某一位的数字
中等
351
相关企业
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
示例 1:
输入:n = 3
输出:3
示例 2:
输入:n = 11
输出:0
限制:
0 <= n < 2^31
思路:
其实并没有什么特别的……就是数数,边数边删(见下面代码的while循环),直到最后落在某个区间,这就能确定目标所在的位置是 几位数的群体(即退出while循环后的digit, 如果digit=2,那么说明落在10-99之间),
再在这个群体里定位是哪一个数字(见int num那一行。比如,27);
进一步,定位是这个数字的哪一位(见最后的return语句。比如,第一位,即7)
注意:从0开始数,也就是0就是第0位,1就是第1位。
class Solution {public int findNthDigit(int n) {int digit=1;int count=9;// int start=1;while(n>count){n-=count;digit++;start*=10;count = digit*start*9;//10-99, 100-999, }int num = start+(n-1)/digit;return Long.toString(num).charAt((n-1)%digit)-'0';// !! 注意这里取出第((n-1)%digit)个字符之后,怎么将它转化为整数再返回}// 参考资料:下面是LeetCode,K神的代码,可以看到大神把start,count这些增长比较快的数设置成Long型;注意最后将某个字符转成数字的代码;注意这代码已经将n=0的情况考虑在内,此时不进入while循环,(n-1)/digit=-1, so num=0.public int findNthDigit2(int n) {int digit = 1;long start = 1;long count = 9;while (n > count) { // 1.n -= count;digit += 1;start *= 10;count = digit * start * 9;}long num = start + (n - 1) / digit; // 2.return Long.toString(num).charAt((n - 1) % digit) - '0'; // 3.}}