File tree 3 files changed +52
-1
lines changed
3 files changed +52
-1
lines changed Original file line number Diff line number Diff line change 28
28
29
29
## 解法
30
30
<!-- 这里可写通用的实现逻辑 -->
31
+ 设 ` f(n, m) ` 表示从 n 个数中每次删除第 m 个,最后剩下的数字。
31
32
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
+ 递归求解即可,也可以改成迭代。
32
40
33
41
### Python3
34
42
<!-- 这里可写当前语言的特殊实现逻辑 -->
35
43
44
+ 递归版本:
45
+
36
46
``` 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
+ 迭代版本:
37
58
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
38
66
```
39
67
40
68
### Java
41
69
<!-- 这里可写当前语言的特殊实现逻辑 -->
42
70
43
71
``` 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
+ }
45
81
```
46
82
47
83
### ...
Original file line number Diff line number Diff line change
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 number Diff line number Diff line change
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
You can’t perform that action at this time.
0 commit comments