[leetcode] 400. Nth Digit

https://leetcode.com/contest/5/problems/nth-digit/

刚开始看不懂题意,后来才理解是这个序列连起来的,看一下第几位是几。然后就是数,1位数几个,2位数几个,3位数几个,int范围2e10,所以处理到11位数差不多,仔细算一下可以更少,然后先找到是几位数,然后除以位数,找到这个数是多少,取余看是第几位,然后就可以了。我预处理每位的个数和开始的位置。

 1 class Solution {
 2 public:
 3    long long d[11];
 4 int b[11];
 5 int init(int n) {
 6     d[0] = 0;
 7     d[1] = 9;
 8     b[1] = 1;
 9     for (int i = 2; i < 11; i++) {
10         d[i] = d[i - 1] * 10;
11         b[i] = b[i - 1] * 10;
12     }
13     for (int i = 1; i < 11; i++) {
14         d[i] = d[i] * i;
15        // cout << d[i] << endl;
16     }
17     int i = 1;
18     for (i = 1; i < 11; i++) {
19         if(d[i] < n)
20             n -= d[i];
21         else break;
22     }
23     n--;
24     int t1 = n / i, t2 = n % i;
25     int k = b[i] + t1;
26     stringstream ss; string s1;
27     ss << k; s1 = ss.str();
28     //cout << t1 << " asd " << t2 << endl;
29     //cout << s1 << endl;
30     //reverse(s1.begin(), s1.end());
31     return s1[t2] - '0';
32 
33 }
34  int findNthDigit(int n) {
35         return init(n);
36     }
37 };
原文地址:https://www.cnblogs.com/y119777/p/5882638.html