leetcode/
nth_digit.rs

1//! # 400. 第N个数字
2//!
3//! 难度 中等
4//!
5//! 在无限的整数序列 `1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...` 中找到第 `n` 个数字。
6//!
7//! ## 注意:
8//!
9//! `n` 是正数且在 32 位整数范围内 ( `n < 231` )。
10//!
11//! ## 示例 1:
12//!
13//! ```text
14//! 输入:
15//! 3
16//!
17//! 输出:
18//! 3
19//! ```
20//!
21//! ## 示例 2:
22//!
23//! ```text
24//! 输入:
25//! 11
26//!
27//! 输出:
28//! 0
29//!
30//! 说明:
31//!
32//! 第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0,它是10的一部分。
33//! ```
34//!
35//! See [leetcode](https://leetcode-cn.com/problems/nth-digit/)
36
37pub struct Solution;
38
39impl Solution {
40    pub fn find_nth_digit(n: i32) -> i32 {
41        let mut rest = n as i64;
42        let mut range: i64 = 9;
43        let mut digits: i32 = 1;
44
45        while rest - range * digits as i64 > 0 {
46            rest = rest - range * digits as i64;
47            digits += 1;
48            range = range * 10;
49        }
50        let rest = rest as i32;
51
52        let base = if digits > 1 {
53            let mut base = 1;
54            for _ in 1..digits {
55                base *= 10;
56            }
57            base
58        } else {
59            0
60        };
61
62        if digits == 1 {
63            return rest;
64        }
65
66        let mut target = rest / digits + base;
67        let rem = rest % digits;
68        if rem == 0 {
69            target = target - 1;
70            return target % 10;
71        }
72
73        let mut x = target;
74        let mut y = 0;
75        for _ in 0..(digits + 1 - rem) {
76            y = x % 10;
77            x = x / 10;
78        }
79        y
80    }
81}
82
83#[cfg(test)]
84mod tests {
85    use super::*;
86
87    #[test]
88    fn test() {
89        let t = |n| Solution::find_nth_digit(n);
90        assert_eq!(3, t(3));
91        assert_eq!(0, t(11));
92    }
93}