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 };