剑指 offer 44. 数字序列中某一位的数字
剑指 Offer 44. 数字序列中某一位的数字
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
示例 1:
输入:n = 3
输出:3
示例 2:
输入:n = 11
输出:0
限制:
- 0 <= n < 2^31
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Solution 1
result = numBitCount / 9 + numBitOffset; 表示n所在数字的具体值
numBitLen 表示result的位长度, numBitLen=2 -> result是2位数
numBitCount 表示位数与result相同的数的数量, numBitCount=90 -> 2位数有90个
numBitOffset 表示result是numBitLen位数中的第几个(numBitOffset=0对应1后全0), numBitOffset=0 -> result是第1个2位数(10)
numBitPosition 表示n是result中的第几位(最右边为第0位), numBitPosition=1 -> n是result(10)的第1位1
class Solution {
public int findNthDigit(int n) {
if (n <= 0)
return 0;
if (n <= 9)
return n;
long numBitLen = 1;
long numBitCount = 9;
long numBitOffset = 0;
long numBitPosition = 0;
while (n > numBitCount * numBitLen) {
n -= numBitCount * numBitLen;
numBitLen++;
numBitCount *= 10;
}
n--;
numBitOffset = n / numBitLen;
numBitPosition = numBitLen - (n % numBitLen);
long result = numBitCount / 9 + numBitOffset;
while (--numBitPosition > 0)
result /= 10;
result %= 10;
return (int) result;
}
}