JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

  • 算法

  • algorithm
  • leetcode
JavaInterview.cn
2022-09-20
目录

24 点游戏Java

文章发布较早,内容可能过时,阅读注意甄别。

# 题目

给定一个长度为4的整数数组 cards 。你有 4 张卡片,每张卡片上都包含一个范围在 [1,9] 的数字。您应该使用运算符 ['+', '-', '*', '/'] 和括号 '(' 和 ')' 将这些卡片上的数字排列成数学表达式,以获得值24。

你须遵守以下规则:

  • 除法运算符 '/' 表示实数除法,而不是整数除法。
  • 例如, 4 /(1 - 2 / 3)= 4 /(1 / 3)= 12 。
  • 每个运算都在两个数字之间。特别是,不能使用 “-” 作为一元运算符。
  • 例如,如果 cards =[1,1,1,1] ,则表达式 “-1 -1 -1 -1” 是 不允许 的。
  • 你不能把数字串在一起
  • 例如,如果 cards =[1,2,1,2] ,则表达式 “12 + 12” 无效。

如果可以得到这样的表达式,其计算结果为 24 ,则返回 true ,否则返回 false 。

示例 1:

输入: cards = [4, 1, 8, 7]
输出: true
解释: (8-4) * (7-1) = 24

示例 2:

输入: cards = [1, 2, 1, 2]
输出: false

提示:

  • cards.length == 4
  • 1 <= cards[i] <= 9

# 思路

dfs

# 解法


class Solution {
   
    boolean ok = false;
    public boolean dfs(ArrayList<Double> list){
        int n = list.size();
        if(n == 1){
            if(Math.abs(list.get(0)-24)<=1e-9){
                return true;
            }else{
                return false;
            }
        }
        for(int i=0; i<n; i++){
            for(int j=i+1; j<n; j++){
                if(ok) break;
                double num1 = list.get(i);
                double num2 = list.get(j);
                ArrayList<Double> remain = new ArrayList<>();
                int index = 0;
                for(int k=0; k<n; k++){
                    if(k != i && k != j){
                        remain.add(list.get(k));
                    }
                }
                // 加
                remain.add(num1 + num2);
                ok |= dfs(remain);
                remain.remove(remain.size()-1);
                // 减
                remain.add(num1 - num2);
                ok |= dfs(remain);
                remain.remove(remain.size()-1);
                remain.add(num2 - num1);
                ok |= dfs(remain);
                remain.remove(remain.size()-1);
                // 乘
                remain.add(num2 * num1);
                ok |= dfs(remain);
                remain.remove(remain.size()-1);
                // 除
                if(num2 != 0.0){
                    remain.add(num1/num2);
                    ok |= dfs(remain);
                    remain.remove(remain.size()-1);
                }
                if(num1 != 0.0){
                    remain.add(num2/num1);
                    ok |= dfs(remain);
                    remain.remove(remain.size()-1);
                }
            }
        }
        return ok;
    }
    public boolean judgePoint24(int[] cards) {
        ArrayList<Double> remain = new ArrayList<>();
        for(int i=0; i<4; i++){
            remain.add(cards[i]*1.0);
        }
        dfs(remain);
        return ok;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

# 总结

  • 分析出几种情况,然后分别对各个情况实现
微信 支付宝
最近更新
01
1686. 石子游戏VI Java
08-18
02
1688. 比赛中的配对次数 Java
08-18
03
1687. 从仓库到码头运输箱子 Java
08-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式