Skip to content

Commit 52491cf

Browse files
committed
feat: add solutions to lcof problem: No.62
1 parent c9a0ef0 commit 52491cf

File tree

3 files changed

+100
-26
lines changed

3 files changed

+100
-26
lines changed

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

+82-21
Original file line numberDiff line numberDiff line change
@@ -37,24 +37,26 @@
3737

3838
<!-- 这里可写通用的实现逻辑 -->
3939

40-
`f(n, m)` 表示从 n 个数中每次删除第 m 个,最后剩下的数字。
40+
**方法一:数学 + 递归(迭代)**
4141

42-
第一次删除第 m 个,剩下 `n-1` 个数,那么 `x = f(n - 1, m)` 就表示从 n-1 个数中每次删除第 m 个,最后剩下的数字
42+
我们不妨设 $f(n, m)$ 表示从 $n$ 个数中每次删除第 $m$ 个,最后剩下的是第几个数字
4343

44-
我们求得 x 之后,便可以知道,`f(n, m)` 应该是从 `m % n` 开始数的第 x 个元素,即 `f(n, m) = ((m % n) + x) % n`
44+
我们第一次删除了第 $m$ 个数字,剩下 $n-1$ 个数,那么 $x=f(n - 1, m)$ 就表示从剩下的 $n-1$ 个数中,每次删除第 $m$ 个,最后剩下的是第几个数字
4545

46-
当 n 为 1 时,最后留下的数字序号一定为 0。
46+
我们求得 $x$ 之后,便可以知道 $f(n, m)$ 应该是从 $m \% n$ 开始数的第 $x$ 个元素,即 $f(n, m) = (m \% n + x) \% n$。
47+
48+
当 $n$ 为 $1$ 时,最后留下的数字序号一定为 $0$。
4749

4850
递归求解即可,也可以改成迭代。
4951

52+
时间复杂度 $O(n)$,递归的空间复杂度 $O(n)$,迭代的空间复杂度 $O(1)$。
53+
5054
<!-- tabs:start -->
5155

5256
### **Python3**
5357

5458
<!-- 这里可写当前语言的特殊实现逻辑 -->
5559

56-
递归版本:
57-
5860
```python
5961
class Solution:
6062
def lastRemaining(self, n: int, m: int) -> int:
@@ -67,8 +69,6 @@ class Solution:
6769
return f(n, m)
6870
```
6971

70-
迭代版本:
71-
7272
```python
7373
class Solution:
7474
def lastRemaining(self, n: int, m: int) -> int:
@@ -82,6 +82,22 @@ class Solution:
8282

8383
<!-- 这里可写当前语言的特殊实现逻辑 -->
8484

85+
```java
86+
class Solution {
87+
public int lastRemaining(int n, int m) {
88+
return f(n, m);
89+
}
90+
91+
private int f(int n, int m) {
92+
if (n == 1) {
93+
return 0;
94+
}
95+
int x = f(n - 1, m);
96+
return (m + x) % n;
97+
}
98+
}
99+
```
100+
85101
```java
86102
class Solution {
87103
public int lastRemaining(int n, int m) {
@@ -94,26 +110,54 @@ class Solution {
94110
}
95111
```
96112

97-
### **JavaScript**
113+
### **C++**
98114

99-
```js
100-
/**
101-
* @param {number} n
102-
* @param {number} m
103-
* @return {number}
104-
*/
105-
var lastRemaining = function (n, m) {
106-
// 约瑟夫环
107-
let res = 0;
108-
for (let i = 1; i <= n; i++) {
109-
res = (res + m) % i;
115+
```cpp
116+
class Solution {
117+
public:
118+
int lastRemaining(int n, int m) {
119+
return f(n, m);
120+
}
121+
122+
int f(int n, int m) {
123+
if (n == 1) {
124+
return 0;
125+
}
126+
int x = f(n - 1, m);
127+
return (m + x) % n;
128+
}
129+
};
130+
```
131+
132+
```cpp
133+
class Solution {
134+
public:
135+
int lastRemaining(int n, int m) {
136+
int f = 0;
137+
for (int i = 2; i <= n; ++i) {
138+
f = (f + m) % i;
139+
}
140+
return f;
110141
}
111-
return res;
112142
};
113143
```
114144
115145
### **Go**
116146
147+
```go
148+
func lastRemaining(n int, m int) int {
149+
var f func(n, m int) int
150+
f = func(n, m int) int {
151+
if n == 1 {
152+
return 0
153+
}
154+
x := f(n-1, m)
155+
return (m + x) % n
156+
}
157+
return f(n, m)
158+
}
159+
```
160+
117161
```go
118162
func lastRemaining(n int, m int) int {
119163
f := 0
@@ -124,6 +168,23 @@ func lastRemaining(n int, m int) int {
124168
}
125169
```
126170

171+
### **JavaScript**
172+
173+
```js
174+
/**
175+
* @param {number} n
176+
* @param {number} m
177+
* @return {number}
178+
*/
179+
var lastRemaining = function (n, m) {
180+
let f = 0;
181+
for (let i = 2; i <= n; ++i) {
182+
f = (f + m) % i;
183+
}
184+
return f;
185+
};
186+
```
187+
127188
### **C#**
128189

129190
```cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
public:
3+
int lastRemaining(int n, int m) {
4+
return f(n, m);
5+
}
6+
7+
int f(int n, int m) {
8+
if (n == 1) {
9+
return 0;
10+
}
11+
int x = f(n - 1, m);
12+
return (m + x) % n;
13+
}
14+
};

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

+4-5
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@
44
* @return {number}
55
*/
66
var lastRemaining = function (n, m) {
7-
// 约瑟夫环
8-
let res = 0;
9-
for (let i = 1; i <= n; i++) {
10-
res = (res + m) % i;
7+
let f = 0;
8+
for (let i = 2; i <= n; ++i) {
9+
f = (f + m) % i;
1110
}
12-
return res;
11+
return f;
1312
};

0 commit comments

Comments
 (0)