Skip to content

Commit 6589186

Browse files
committed
feat: add solutions to lc problem: No.0390
No.0390.Elimination Game
1 parent 103851a commit 6589186

File tree

6 files changed

+250
-2
lines changed

6 files changed

+250
-2
lines changed

solution/0300-0399/0390.Elimination Game/README.md

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,116 @@ n = 9,
2929

3030
<!-- 这里可写通用的实现逻辑 -->
3131

32+
`i` 记录该从左边还是右边进行删除。由于经过每轮删除过后都是一个等差数列,因此我们用 `a1`, `an` 记录首尾元素,`cnt` 记录数列元素个数,`step` 记录元素间的间隔,`step` 初始为 1。
33+
34+
- 若从左边删除:
35+
- `a1` 变为 `a1 + step`
36+
-`cnt` 为奇数个,`an` 变为 `an - step`,否则 `an` 不变
37+
- 若从右边删除:
38+
- `an` 变为 `an - step`
39+
-`cnt` 为奇数个,`a1` 变为 `a1 + step`,否则 `a1` 不变
40+
41+
每次经过一轮删除,数列元素个数 `cnt` 变为 `cnt >> 1`,元素间隔 `step` 变为 `step << 1``i` 自增 1。
42+
43+
当元素个数剩下 1 个时,退出循环,返回 `a1` 即可。
44+
3245
<!-- tabs:start -->
3346

3447
### **Python3**
3548

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

3851
```python
39-
52+
class Solution:
53+
def lastRemaining(self, n: int) -> int:
54+
a1, an = 1, n
55+
i, step, cnt = 0, 1, n
56+
while cnt > 1:
57+
if i % 2:
58+
an -= step
59+
if cnt % 2:
60+
a1 += step
61+
else:
62+
a1 += step
63+
if cnt % 2:
64+
an -= step
65+
cnt >>= 1
66+
step <<= 1
67+
i += 1
68+
return a1
4069
```
4170

4271
### **Java**
4372

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

4675
```java
76+
class Solution {
77+
public int lastRemaining(int n) {
78+
int a1 = 1, an = n, step = 1;
79+
for (int i = 0, cnt = n; cnt > 1; cnt >>= 1, step <<= 1, ++i) {
80+
if (i % 2 == 1) {
81+
an -= step;
82+
if (cnt % 2 == 1) {
83+
a1 += step;
84+
}
85+
} else {
86+
a1 += step;
87+
if (cnt % 2 == 1) {
88+
an -= step;
89+
}
90+
}
91+
}
92+
return a1;
93+
}
94+
}
95+
```
96+
97+
### **C++**
98+
99+
```cpp
100+
class Solution {
101+
public:
102+
int lastRemaining(int n) {
103+
int a1 = 1, an = n, step = 1;
104+
for (int i = 0, cnt = n; cnt > 1; cnt >>= 1, step <<= 1, ++i)
105+
{
106+
if (i % 2)
107+
{
108+
an -= step;
109+
if (cnt % 2) a1 += step;
110+
}
111+
else
112+
{
113+
a1 += step;
114+
if (cnt % 2) an -= step;
115+
}
116+
}
117+
return a1;
118+
}
119+
};
120+
```
47121
122+
### **Go**
123+
124+
```go
125+
func lastRemaining(n int) int {
126+
a1, an, step := 1, n, 1
127+
for i, cnt := 0, n; cnt > 1; cnt, step, i = cnt>>1, step<<1, i+1 {
128+
if i%2 == 1 {
129+
an -= step
130+
if cnt%2 == 1 {
131+
a1 += step
132+
}
133+
} else {
134+
a1 += step
135+
if cnt%2 == 1 {
136+
an -= step
137+
}
138+
}
139+
}
140+
return a1
141+
}
48142
```
49143

50144
### **...**

solution/0300-0399/0390.Elimination Game/README_EN.md

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,94 @@ arr = [6]
4848
### **Python3**
4949

5050
```python
51-
51+
class Solution:
52+
def lastRemaining(self, n: int) -> int:
53+
a1, an = 1, n
54+
i, step, cnt = 0, 1, n
55+
while cnt > 1:
56+
if i % 2:
57+
an -= step
58+
if cnt % 2:
59+
a1 += step
60+
else:
61+
a1 += step
62+
if cnt % 2:
63+
an -= step
64+
cnt >>= 1
65+
step <<= 1
66+
i += 1
67+
return a1
5268
```
5369

5470
### **Java**
5571

5672
```java
73+
class Solution {
74+
public int lastRemaining(int n) {
75+
int a1 = 1, an = n, step = 1;
76+
for (int i = 0, cnt = n; cnt > 1; cnt >>= 1, step <<= 1, ++i) {
77+
if (i % 2 == 1) {
78+
an -= step;
79+
if (cnt % 2 == 1) {
80+
a1 += step;
81+
}
82+
} else {
83+
a1 += step;
84+
if (cnt % 2 == 1) {
85+
an -= step;
86+
}
87+
}
88+
}
89+
return a1;
90+
}
91+
}
92+
```
93+
94+
### **C++**
95+
96+
```cpp
97+
class Solution {
98+
public:
99+
int lastRemaining(int n) {
100+
int a1 = 1, an = n, step = 1;
101+
for (int i = 0, cnt = n; cnt > 1; cnt >>= 1, step <<= 1, ++i)
102+
{
103+
if (i % 2)
104+
{
105+
an -= step;
106+
if (cnt % 2) a1 += step;
107+
}
108+
else
109+
{
110+
a1 += step;
111+
if (cnt % 2) an -= step;
112+
}
113+
}
114+
return a1;
115+
}
116+
};
117+
```
57118
119+
### **Go**
120+
121+
```go
122+
func lastRemaining(n int) int {
123+
a1, an, step := 1, n, 1
124+
for i, cnt := 0, n; cnt > 1; cnt, step, i = cnt>>1, step<<1, i+1 {
125+
if i%2 == 1 {
126+
an -= step
127+
if cnt%2 == 1 {
128+
a1 += step
129+
}
130+
} else {
131+
a1 += step
132+
if cnt%2 == 1 {
133+
an -= step
134+
}
135+
}
136+
}
137+
return a1
138+
}
58139
```
59140

60141
### **...**
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int lastRemaining(int n) {
4+
int a1 = 1, an = n, step = 1;
5+
for (int i = 0, cnt = n; cnt > 1; cnt >>= 1, step <<= 1, ++i)
6+
{
7+
if (i % 2)
8+
{
9+
an -= step;
10+
if (cnt % 2) a1 += step;
11+
}
12+
else
13+
{
14+
a1 += step;
15+
if (cnt % 2) an -= step;
16+
}
17+
}
18+
return a1;
19+
}
20+
};
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
func lastRemaining(n int) int {
2+
a1, an, step := 1, n, 1
3+
for i, cnt := 0, n; cnt > 1; cnt, step, i = cnt>>1, step<<1, i+1 {
4+
if i%2 == 1 {
5+
an -= step
6+
if cnt%2 == 1 {
7+
a1 += step
8+
}
9+
} else {
10+
a1 += step
11+
if cnt%2 == 1 {
12+
an -= step
13+
}
14+
}
15+
}
16+
return a1
17+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public int lastRemaining(int n) {
3+
int a1 = 1, an = n, step = 1;
4+
for (int i = 0, cnt = n; cnt > 1; cnt >>= 1, step <<= 1, ++i) {
5+
if (i % 2 == 1) {
6+
an -= step;
7+
if (cnt % 2 == 1) {
8+
a1 += step;
9+
}
10+
} else {
11+
a1 += step;
12+
if (cnt % 2 == 1) {
13+
an -= step;
14+
}
15+
}
16+
}
17+
return a1;
18+
}
19+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution:
2+
def lastRemaining(self, n: int) -> int:
3+
a1, an = 1, n
4+
i, step, cnt = 0, 1, n
5+
while cnt > 1:
6+
if i % 2:
7+
an -= step
8+
if cnt % 2:
9+
a1 += step
10+
else:
11+
a1 += step
12+
if cnt % 2:
13+
an -= step
14+
cnt >>= 1
15+
step <<= 1
16+
i += 1
17+
return a1

0 commit comments

Comments
 (0)