Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

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

Lines changed: 37 additions & 1 deletion
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
### ...
Lines changed: 9 additions & 0 deletions
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+
}
Lines changed: 6 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /