1pub 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}