Skip to content

Commit f4c3c33

Browse files
authored
feat: add solutions to lc problem: No.0679 (doocs#2046)
No.0679.24 Game
1 parent 5b79905 commit f4c3c33

File tree

8 files changed

+788
-70
lines changed

8 files changed

+788
-70
lines changed

solution/0600-0699/0679.24 Game/README.md

Lines changed: 268 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,22 +60,290 @@
6060

6161
<!-- 这里可写通用的实现逻辑 -->
6262

63+
**方法一:DFS**
64+
65+
我们设计一个函数 $dfs(nums)$,其中 $nums$ 表示当前的数字序列,函数返回一个布尔值,表示是否存在一种排列方式,使得这个数字序列可以得到 $24$。
66+
67+
如果 $nums$ 的长度为 $1$,那么只有当这个数字等于 $24$ 时,我们才返回 $true$,否则返回 $false$。
68+
69+
否则,我们可以枚举 $nums$ 中的任意两个数 $a$ 和 $b$ 作为左右两个操作数,枚举 $a$ 和 $b$ 之间的运算符 $op$,那么 $a\ op\ b$ 的结果就可以作为新的数字序列的一个元素,我们将其加入到新的数字序列中,并从 $nums$ 中移除 $a$ 和 $b$,然后递归地调用 $dfs$ 函数,如果返回 $true$,那么我们就找到了一种排列方式,使得这个数字序列可以得到 $24$,我们就返回 $true$。
70+
71+
如果枚举完所有的情况都没有返回 $true$,那么我们就返回 $false$。
72+
6373
<!-- tabs:start -->
6474

6575
### **Python3**
6676

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

6979
```python
80+
class Solution:
81+
def judgePoint24(self, cards: List[int]) -> bool:
82+
def dfs(nums: List[float]):
83+
n = len(nums)
84+
if n == 1:
85+
if abs(nums[0] - 24) < 1e-6:
86+
return True
87+
return False
88+
ok = False
89+
for i in range(n):
90+
for j in range(n):
91+
if i != j:
92+
nxt = [nums[k] for k in range(n) if k != i and k != j]
93+
for op in ops:
94+
match op:
95+
case "/":
96+
if nums[j] == 0:
97+
continue
98+
ok |= dfs(nxt + [nums[i] / nums[j]])
99+
case "*":
100+
ok |= dfs(nxt + [nums[i] * nums[j]])
101+
case "+":
102+
ok |= dfs(nxt + [nums[i] + nums[j]])
103+
case "-":
104+
ok |= dfs(nxt + [nums[i] - nums[j]])
105+
if ok:
106+
return True
107+
return ok
70108

109+
ops = ("+", "-", "*", "/")
110+
nums = [float(x) for x in cards]
111+
return dfs(nums)
71112
```
72113

73114
### **Java**
74115

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

77118
```java
119+
class Solution {
120+
private final char[] ops = {'+', '-', '*', '/'};
121+
122+
public boolean judgePoint24(int[] cards) {
123+
List<Double> nums = new ArrayList<>();
124+
for (int num : cards) {
125+
nums.add((double) num);
126+
}
127+
return dfs(nums);
128+
}
129+
130+
private boolean dfs(List<Double> nums) {
131+
int n = nums.size();
132+
if (n == 1) {
133+
return Math.abs(nums.get(0) - 24) < 1e-6;
134+
}
135+
boolean ok = false;
136+
for (int i = 0; i < n; ++i) {
137+
for (int j = 0; j < n; ++j) {
138+
if (i != j) {
139+
List<Double> nxt = new ArrayList<>();
140+
for (int k = 0; k < n; ++k) {
141+
if (k != i && k != j) {
142+
nxt.add(nums.get(k));
143+
}
144+
}
145+
for (char op : ops) {
146+
switch (op) {
147+
case '/' -> {
148+
if (nums.get(j) == 0) {
149+
continue;
150+
}
151+
nxt.add(nums.get(i) / nums.get(j));
152+
}
153+
case '*' -> {
154+
nxt.add(nums.get(i) * nums.get(j));
155+
}
156+
case '+' -> {
157+
nxt.add(nums.get(i) + nums.get(j));
158+
}
159+
case '-' -> {
160+
nxt.add(nums.get(i) - nums.get(j));
161+
}
162+
}
163+
ok |= dfs(nxt);
164+
if (ok) {
165+
return true;
166+
}
167+
nxt.remove(nxt.size() - 1);
168+
}
169+
}
170+
}
171+
}
172+
return ok;
173+
}
174+
}
175+
```
176+
177+
### **C++**
178+
179+
```cpp
180+
class Solution {
181+
public:
182+
bool judgePoint24(vector<int>& cards) {
183+
vector<double> nums;
184+
for (int num : cards) {
185+
nums.push_back(static_cast<double>(num));
186+
}
187+
return dfs(nums);
188+
}
189+
190+
private:
191+
const char ops[4] = {'+', '-', '*', '/'};
192+
193+
bool dfs(vector<double>& nums) {
194+
int n = nums.size();
195+
if (n == 1) {
196+
return abs(nums[0] - 24) < 1e-6;
197+
}
198+
bool ok = false;
199+
for (int i = 0; i < n; ++i) {
200+
for (int j = 0; j < n; ++j) {
201+
if (i != j) {
202+
vector<double> nxt;
203+
for (int k = 0; k < n; ++k) {
204+
if (k != i && k != j) {
205+
nxt.push_back(nums[k]);
206+
}
207+
}
208+
for (char op : ops) {
209+
switch (op) {
210+
case '/':
211+
if (nums[j] == 0) {
212+
continue;
213+
}
214+
nxt.push_back(nums[i] / nums[j]);
215+
break;
216+
case '*':
217+
nxt.push_back(nums[i] * nums[j]);
218+
break;
219+
case '+':
220+
nxt.push_back(nums[i] + nums[j]);
221+
break;
222+
case '-':
223+
nxt.push_back(nums[i] - nums[j]);
224+
break;
225+
}
226+
ok |= dfs(nxt);
227+
if (ok) {
228+
return true;
229+
}
230+
nxt.pop_back();
231+
}
232+
}
233+
}
234+
}
235+
return ok;
236+
}
237+
};
238+
```
239+
240+
### **Go**
241+
242+
```go
243+
func judgePoint24(cards []int) bool {
244+
ops := [4]rune{'+', '-', '*', '/'}
245+
nums := make([]float64, len(cards))
246+
for i, num := range cards {
247+
nums[i] = float64(num)
248+
}
249+
var dfs func([]float64) bool
250+
dfs = func(nums []float64) bool {
251+
n := len(nums)
252+
if n == 1 {
253+
return math.Abs(nums[0]-24) < 1e-6
254+
}
255+
ok := false
256+
for i := 0; i < n; i++ {
257+
for j := 0; j < n; j++ {
258+
if i != j {
259+
var nxt []float64
260+
for k := 0; k < n; k++ {
261+
if k != i && k != j {
262+
nxt = append(nxt, nums[k])
263+
}
264+
}
265+
for _, op := range ops {
266+
switch op {
267+
case '/':
268+
if nums[j] == 0 {
269+
continue
270+
}
271+
nxt = append(nxt, nums[i]/nums[j])
272+
case '*':
273+
nxt = append(nxt, nums[i]*nums[j])
274+
case '+':
275+
nxt = append(nxt, nums[i]+nums[j])
276+
case '-':
277+
nxt = append(nxt, nums[i]-nums[j])
278+
}
279+
ok = ok || dfs(nxt)
280+
if ok {
281+
return true
282+
}
283+
nxt = nxt[:len(nxt)-1]
284+
}
285+
}
286+
}
287+
}
288+
return ok
289+
}
290+
291+
return dfs(nums)
292+
}
293+
```
294+
295+
### **TypeScript**
296+
297+
```ts
298+
function judgePoint24(cards: number[]): boolean {
299+
const ops: string[] = ['+', '-', '*', '/'];
300+
const dfs = (nums: number[]): boolean => {
301+
const n: number = nums.length;
302+
if (n === 1) {
303+
return Math.abs(nums[0] - 24) < 1e-6;
304+
}
305+
let ok: boolean = false;
306+
for (let i = 0; i < n; i++) {
307+
for (let j = 0; j < n; j++) {
308+
if (i !== j) {
309+
const nxt: number[] = [];
310+
for (let k = 0; k < n; k++) {
311+
if (k !== i && k !== j) {
312+
nxt.push(nums[k]);
313+
}
314+
}
315+
for (const op of ops) {
316+
switch (op) {
317+
case '/':
318+
if (nums[j] === 0) {
319+
continue;
320+
}
321+
nxt.push(nums[i] / nums[j]);
322+
break;
323+
case '*':
324+
nxt.push(nums[i] * nums[j]);
325+
break;
326+
case '+':
327+
nxt.push(nums[i] + nums[j]);
328+
break;
329+
case '-':
330+
nxt.push(nums[i] - nums[j]);
331+
break;
332+
}
333+
ok = ok || dfs(nxt);
334+
if (ok) {
335+
return true;
336+
}
337+
nxt.pop();
338+
}
339+
}
340+
}
341+
}
342+
return ok;
343+
};
78344

345+
return dfs(cards);
346+
}
79347
```
80348

81349
### **...**

0 commit comments

Comments
 (0)