1. 程式人生 > >劍指Offer(第二版)面試題44:數字序列中某一位的數字

劍指Offer(第二版)面試題44:數字序列中某一位的數字

劍指Offer(第二版)面試題18:刪除連結串列的節點

題目:

數字按照0123456789101112131415161718192021…的順序排列。第5位(從0開始計數)為5,第13位為1,第19位為4…… 求任意第n位對應的數字。

思路

  • 直觀方法做列舉。每列舉一個數字的時候,求出該數字是幾位數,並把數字的位數和前面的所有數字的位數相加。當累加的數位大於n時,那麼第n位數字一定在這個數字裡。
  • 當然正確的思路是找出某些規律跳過若干數字。例如:序列前十位是0~9。接下來180位數字是90個10~99的兩位數。接下來的2700位是900個100~999的三位數。

程式碼

#include <iostream>
#include <cmath> using namespace std; int core(int num); int getSizeOfDigit(int i); int getResult(int digit,int num); int main() { int num = 0; while(num != -1) { cout << "type a size" << endl; cin >> num; int result = core(num); cout << result << endl; } return
0; } int core(int num) { if(num < 0) return -1; int digit = 1; while(true) { int numbers = getSizeOfDigit(digit); if(num < numbers * digit) return getResult(digit,num); num -= digit * numbers; ++digit; } } int getSizeOfDigit(int
i) { if(i == 1) return 10; return 9*std::pow(10,i-1); } int getResult(int digit,int num) { int beginNum = 0; if(digit == 1) beginNum = 0; else beginNum = (int) std::pow(10,digit - 1); int resultNum = beginNum + num/digit; int countFromRight = digit - num % digit; for(int i = 0; i < countFromRight - 1; ++i) resultNum /= 10; return resultNum%10; }