码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] Nth Digit

时间:2017-12-06 20:00:10      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:rip   code   input   man   pre   note   sequence   题目   return   

Find the nth digit of the infinite integer sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...

Note:
n is positive and will fit within the range of a 32-bit signed integer (n < 231).

Example 1:

Input:
3

Output:
3

 

Example 2:

Input:
11

Output:
0

Explanation:
The 11th digit of the sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... is a 0, which is part of the number 10.

 

找出1~n有序数字中的第n位。
首先需要确定的是1-9之间有9个数。10-99之间有90个数,100-999之间有900个数。
如果要找出有序数中第n个数,需要判断这个第n位的区间范围,实在1-9之间还是在10-99之间。
所以需要一个base和digits来确定n属于的大致区间及所在区间的整数位数。
step1:确定n所在整数区间的整数位数,这时n就表示从该digits整数位数开始的第n位。
step2:计算第n个数字是什么。
step3:这个数字中的第index位。也就是题目要求的第n位值。
class Solution {
public:
    int findNthDigit(int n) {
        // 1. calc how many digits the number has.
        long base = 9, digits = 1;
        while (n - base * digits > 0) {
            n -= base * digits;
            base *= 10;
            digits++;
        }
        
        // 2. calc what the number is.
        int index = n % digits;
        if (index == 0)
            index = digits;
        long num = 1;
        for (int i = 1; i < digits; i++)
            num *= 10;
        num += (index == digits) ? n / digits - 1 : n / digits;
        
        // 3. find out which digit in the number.
        for (int i = index; i < digits; i++)
            num /= 10;
        return num % 10;
    }
};
// 3 ms

 

[LeetCode] Nth Digit

标签:rip   code   input   man   pre   note   sequence   题目   return   

原文地址:http://www.cnblogs.com/immjc/p/7994218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!