Skip to content

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

lcof/面试题62. 圆圈中最后剩下的数字/README.md

+37-1
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,56 @@
2828

2929
## 解法
3030
<!-- 这里可写通用的实现逻辑 -->
31+
`f(n, m)` 表示从 n 个数中每次删除第 m 个,最后剩下的数字。
3132

33+
第一次删除第 m 个,剩下 `n-1` 个数,那么 `x = f(n - 1, m)` 就表示从 n-1 个数中每次删除第 m 个,最后剩下的数字。
34+
35+
我们求得 x 之后,便可以知道,`f(n, m)` 应该是从 `m % n` 开始数的第 x 个元素,即 `f(n, m) = ((m % n) + x) % n`
36+
37+
当 n 为 1 时,最后留下的数字序号一定为 0。
38+
39+
递归求解即可,也可以改成迭代。
3240

3341
### Python3
3442
<!-- 这里可写当前语言的特殊实现逻辑 -->
3543

44+
递归版本:
45+
3646
```python
47+
class Solution:
48+
def lastRemaining(self, n: int, m: int) -> int:
49+
def f(n, m):
50+
if n == 1:
51+
return 0
52+
x = f(n - 1, m)
53+
return (m + x) % n
54+
return f(n, m)
55+
```
56+
57+
迭代版本:
3758

59+
```python
60+
class Solution:
61+
def lastRemaining(self, n: int, m: int) -> int:
62+
f = 0
63+
for i in range(2, n + 1):
64+
f = (f + m) % i
65+
return f
3866
```
3967

4068
### Java
4169
<!-- 这里可写当前语言的特殊实现逻辑 -->
4270

4371
```java
44-
72+
class Solution {
73+
public int lastRemaining(int n, int m) {
74+
int f = 0;
75+
for (int i = 2; i <= n; ++i) {
76+
f = (f + m) % i;
77+
}
78+
return f;
79+
}
80+
}
4581
```
4682

4783
### ...
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution {
2+
public int lastRemaining(int n, int m) {
3+
int f = 0;
4+
for (int i = 2; i <= n; ++i) {
5+
f = (f + m) % i;
6+
}
7+
return f;
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class Solution:
2+
def lastRemaining(self, n: int, m: int) -> int:
3+
f = 0
4+
for i in range(2, n + 1):
5+
f = (f + m) % i
6+
return f

0 commit comments

Comments
 (0)