题意:给出一个正整数n<2^31-1,求序列中1,2,3,4,...,的第n个数是多少。如果n=10,第10个数是0
思路:用两个数组f和init,数组f[i]表示位数为i的数的个数,init[i]表示位数为i的最小值。从下标1开始,直到n-i*f[i]小于0,此时找到第n位数所在的数有几位。然后找到在位数为i时所在的第几个数,接着确定是这个数的第几位。
代码如下:
public class Solution
{
private static final int N = 15;
private static long[] f;
private static long[] init;
static
{
f = new long[N];
init = new long[N];
f[1] = 9;
init[1] = 1;
for (int i = 2; i < N; i++)
{
f[i] = f[i - 1] * 10;
init[i] = init[i - 1] * 10;
}
}
public int findNthDigit(int n)
{
/*
for (int i = 1; i < N; i++)
{
System.out.println(f[i]);
}
*/
int index = 1;
while (n - index * f[index] > 0)
{
n -= index * f[index];
index++;
}
int cnt = (n + index - 1) / index - 1;
int remainder = n % index;
//System.out.println("index:" + index + " n:" + n + " cnt:" + cnt + " remainder:" + remainder);
String str = Long.toString(init[index] + cnt);
//System.out.println("str:" + str);
if (remainder == 0)
{
return Integer.parseInt(str.substring(str.length() - 1));
}
else
{
return Integer.parseInt(str.substring(remainder - 1, remainder));
}
}
}