剑指 Offer 44. 数字序列中某一位的数字

数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。

示例 1:
输入:n = 3
输出:3

示例 2:
输入:n = 11
输出:0

限制:

  • 0 <= n < 2^31
  1. class Solution {
  2. public int findNthDigit(int n) {
  3. long k = 1, s = 9, b = 1;
  4. // 循环找到位置n的数是几位数
  5. while (n > k * s) {
  6. n -= k * s;
  7. k++;
  8. s *= 10;
  9. b *= 10;
  10. }
  11. //找到位置n所在的数,注意这里是向上取整!!!
  12. b += (n + k - 1) / k - 1;
  13. //注意这里有个细节:找到n所在的数后,从高位到低位数数,1,2,3,..., k
  14. //如果余数为0说明是这个数的最低位
  15. long idx = n % k == 0 ? k : n % k;
  16. String res = Long.toString(b);
  17. return res.charAt((int)(idx - 1)) - '0';
  18. }
  19. }

注意:给定一个数 n ,使其除以k并向上取整,如何操作?
res = (n + k - 1) / k