Skip to content

Commit f11020c

Browse files
committed
feat: add python and java solutions to lcof question
添加《剑指 Offer》题解:面试题44. 数字序列中某一位的数字
1 parent 5a3dc9e commit f11020c

File tree

4 files changed

+130
-1
lines changed

4 files changed

+130
-1
lines changed

lcof/面试题41. 数据流中的中位数/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
<!-- 这里可写通用的实现逻辑 -->
4444
- 创建大根堆、小根堆,其中:大根堆存放较小的一半元素,小根堆存放较大的一半元素。
4545
- 添加元素时,若两堆元素个数相等,放入小根堆(使得小根堆个数多1);若不等,放入大根堆(使得大小根堆元素个数相等)
46-
- 取中位数时,若两队元素个数相等,取两堆顶求平均值;若不等,取小根堆堆顶。
46+
- 取中位数时,若两堆元素个数相等,取两堆顶求平均值;若不等,取小根堆堆顶。
4747

4848
### Python3
4949
<!-- 这里可写当前语言的特殊实现逻辑 -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# [面试题44. 数字序列中某一位的数字](https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/)
2+
3+
## 题目描述
4+
<!-- 这里写题目描述 -->
5+
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
6+
7+
请写一个函数,求任意第n位对应的数字。
8+
9+
**示例 1:**
10+
11+
```
12+
输入:n = 3
13+
输出:3
14+
```
15+
16+
**示例 2:**
17+
18+
```
19+
输入:n = 11
20+
输出:0
21+
```
22+
23+
**限制:**
24+
25+
- `0 <= n < 2^31`
26+
27+
注意:本题与主站 400 题相同:https://leetcode-cn.com/problems/nth-digit/
28+
29+
## 解法
30+
<!-- 这里可写通用的实现逻辑 -->
31+
- pow = 0:0~9 有 10 位
32+
- pow = 1: 10~99 有 `90*2=180`
33+
- pow = 2: 100~999 有 `900*3=2700` 位。
34+
35+
先求出第 n 位所在的 pow 和真实数字,进而求出真实数字的第 `n % (pow + 1)` 位即可。
36+
37+
### Python3
38+
<!-- 这里可写当前语言的特殊实现逻辑 -->
39+
40+
```python
41+
class Solution:
42+
def findNthDigit(self, n: int) -> int:
43+
def get_bit_num():
44+
return 10 if p == 0 else 9 * pow(10, p) * (p + 1)
45+
46+
if n < 10:
47+
return n
48+
p = count = 0
49+
while 1:
50+
count = get_bit_num()
51+
if n < count: break
52+
n -= count
53+
p += 1
54+
num = n // (p + 1) + pow(10, p)
55+
return int(str(num)[n % (p + 1)])
56+
57+
58+
59+
```
60+
61+
### Java
62+
<!-- 这里可写当前语言的特殊实现逻辑 -->
63+
64+
```java
65+
class Solution {
66+
public int findNthDigit(int n) {
67+
if (n < 10) return n;
68+
int pow = 0, count;
69+
while (true) {
70+
count = getBitNum(pow);
71+
if (n < count) break;
72+
n -= count;
73+
++pow;
74+
}
75+
int num = n / (pow + 1) + (int) Math.pow(10, pow);
76+
return String.valueOf(num).charAt(n % (pow + 1)) - '0';
77+
}
78+
79+
private int getBitNum(int pow) {
80+
if (pow == 0) {
81+
return 10;
82+
}
83+
return (int) (9 * Math.pow(10, pow) * (pow + 1));
84+
}
85+
}
86+
```
87+
88+
### ...
89+
```
90+
91+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public int findNthDigit(int n) {
3+
if (n < 10) return n;
4+
int pow = 0, count;
5+
while (true) {
6+
count = getBitNum(pow);
7+
if (n < count) break;
8+
n -= count;
9+
++pow;
10+
}
11+
int num = n / (pow + 1) + (int) Math.pow(10, pow);
12+
return String.valueOf(num).charAt(n % (pow + 1)) - '0';
13+
}
14+
15+
private int getBitNum(int pow) {
16+
if (pow == 0) {
17+
return 10;
18+
}
19+
return (int) (9 * Math.pow(10, pow) * (pow + 1));
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution:
2+
def findNthDigit(self, n: int) -> int:
3+
def get_bit_num():
4+
return 10 if p == 0 else 9 * pow(10, p) * (p + 1)
5+
6+
if n < 10:
7+
return n
8+
p = count = 0
9+
while 1:
10+
count = get_bit_num()
11+
if n < count: break
12+
n -= count
13+
p += 1
14+
num = n // (p + 1) + pow(10, p)
15+
return int(str(num)[n % (p + 1)])
16+
17+

0 commit comments

Comments
 (0)