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

解法:数位统计

  1. 确定n对应一个几位数
  2. 确定n对应几位数的第几个,也就是n具体对应哪一个数
  3. 确定n对应这个数的第几位

时间复杂度O(logn),空间复杂度O(1)

  1. class Solution {
  2. public:
  3. int digitAtIndex(int n) {
  4. int m = n;
  5. // i:几位数,base:几位数的开头,cnt:几位数一共有多少个,sum:一共有多少个数
  6. long long i = 1, base = 1, cnt = 9, sum = 1;
  7. while (m > i * cnt) {
  8. m -= i * cnt;
  9. sum += i * cnt;
  10. i++;
  11. cnt *= 10;
  12. base *= 10;
  13. }
  14. int num = base + (n - sum) / i; // 具体是哪一个数,向下取整,所以整除是正好,不然是前一个
  15. int p = n - sum - (num - base) * i; // 数字的第几位
  16. for (int j = 0; j < i - p - 1; j++) num /= 10;
  17. return num % 10;
  18. }
  19. };