Skip to content

Commit f82ca7d

Browse files
committed
feat: add solutions to lcof problem: No.44
1 parent fae5f45 commit f82ca7d

File tree

1 file changed

+72
-1
lines changed
  • lcof/面试题44. 数字序列中某一位的数字

1 file changed

+72
-1
lines changed

lcof/面试题44. 数字序列中某一位的数字/README.md

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545

4646
具体做法是,首先计算出 $n$ 对应的是当前位数的哪一个数字,然后计算出是该数字的第几位,从而得到该位上的数字。
4747

48-
时间复杂度 $O(\log_{10} n)$。
48+
时间复杂度 $O(\log_{10} n)$,空间复杂度 $O(1)$。其中 $n$ 为给定的数字
4949

5050
<!-- tabs:start -->
5151

@@ -66,6 +66,21 @@ class Solution:
6666
return int(str(num)[idx])
6767
```
6868

69+
```python
70+
class Solution:
71+
def findNthDigit(self, n: int) -> int:
72+
if n < 10:
73+
return n
74+
n -= 10
75+
k, p = 2, 10
76+
while n >= 9 * k * p:
77+
n -= 9 * k * p
78+
k += 1
79+
p *= 10
80+
x = p + n // k
81+
return int(str(x)[n % k])
82+
```
83+
6984
### **Java**
7085

7186
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -86,6 +101,25 @@ class Solution {
86101
}
87102
```
88103

104+
```java
105+
class Solution {
106+
public int findNthDigit(int n) {
107+
if (n < 10) {
108+
return n;
109+
}
110+
n -= 10;
111+
int k = 2, p = 10;
112+
while (n >= (long) 9 * k * p) {
113+
n -= 9 * k * p;
114+
++k;
115+
p *= 10;
116+
}
117+
int x = p + n / k;
118+
return String.valueOf(x).charAt(n % k) - '0';
119+
}
120+
}
121+
```
122+
89123
### **C++**
90124

91125
```cpp
@@ -105,6 +139,26 @@ public:
105139
};
106140
```
107141
142+
```cpp
143+
class Solution {
144+
public:
145+
int findNthDigit(int n) {
146+
if (n < 10) {
147+
return n;
148+
}
149+
n -= 10;
150+
int k = 2, p = 10;
151+
while (n >= 9ll * k * p) {
152+
n -= 9 * k * p;
153+
++k;
154+
p *= 10;
155+
}
156+
int x = p + n / k;
157+
return to_string(x)[n % k] - '0';
158+
}
159+
};
160+
```
161+
108162
### **Go**
109163

110164
```go
@@ -121,6 +175,23 @@ func findNthDigit(n int) int {
121175
}
122176
```
123177

178+
```go
179+
func findNthDigit(n int) int {
180+
if n < 10 {
181+
return n
182+
}
183+
n -= 10
184+
k, p := 2, 10
185+
for n >= 9*k*p {
186+
n -= 9 * k * p
187+
k++
188+
p *= 10
189+
}
190+
x := p + n/k
191+
return int(strconv.Itoa(x)[n%k] - '0')
192+
}
193+
```
194+
124195
### **JavaScript**
125196

126197
```js

0 commit comments

Comments
 (0)