• LeetCode——24 点游戏


    Q:你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。

    示例 1:
    输入: [4, 1, 8, 7]
    输出: True
    解释: (8-4) * (7-1) = 24
    示例 2:
    输入: [1, 2, 1, 2]
    输出: False
    注意:
    除法运算符 / 表示实数除法,而不是整数除法。例如 4 / (1 - 2/3) = 12 。
    每个运算符对两个数进行运算。特别是我们不能用 - 作为一元运算符。例如,[1, 1, 1, 1] 作为输入时,表达式 -1 - 1 - 1 - 1 是不允许的。
    你不能将数字连接在一起。例如,输入为 [1, 2, 1, 2] 时,不能写成 12 + 12 。

    A:
    回溯法
    代码:

        public boolean judgePoint24(int[] nums) {
            ArrayList<Double> array = new ArrayList<>();
            for (int n : nums) {
                array.add((double) n);
            }
            return solve(array);
        }
    
        //从数组中选出两个数,把运算结果加到数组中
        private boolean solve(ArrayList<Double> array) {
            if (array.size() == 1) {//数组中只剩下一个数的时候判断结果
                return Math.abs(array.get(0) - 24) < 1e-6;
            }
            //从numbers中取出两个数,把结果放入数组中
            for (int i = 0; i < array.size(); i++) {
                for (int j = 0; j < array.size(); j++) {
                    if (i != j) {
                        //取不同的两个数
                        ArrayList<Double> nums = new ArrayList<>();
                        for (int k = 0; k < array.size(); k++) {
                            if (k != i && k != j) {
                                //把剩下的数加入到新数组
                                nums.add(array.get(k));
                            }
                        }
                        //获取两个数运算的结果集
                        Set<Double> doubles = calculate(array.get(i), array.get(j));
                        for (Double a : doubles) {
                            //把两个数运算的结果,分别加入到新数组中
                            nums.add(a);
                            if (solve(nums)) {//找到一个结果,立即返回
                                return true;
                            }
                            nums.remove(nums.size() - 1);//恢复现场
                        }
                    }
                }
            }
            return false;
        }
    
        private Set<Double> calculate(Double a, Double b) {
            Set<Double> res = new HashSet<>();
            res.add(a - b);
            res.add(b - a);
            res.add(a + b);
            res.add(a * b);
            if (a != 0) {
                res.add(b / a);
            }
            if (b != 0) {
                res.add(a / b);
            }
            return res;
        }
    
  • 相关阅读:
    数据移除的循环
    C#窗体多语言切换(简繁)
    C# 文字转换最简单的方法
    使用CodeDOM动态编译一个字符串表达式
    C#设置WebBrowser默认浏览器
    Image和字节数组互转
    苹果手机的SB系列(8)为什么没有短信全部删除?
    循环删除外键约束
    腾讯云COS自定义域名,支持https,CDN,私有访问
    腾讯云COS请求签名C#版
  • 原文地址:https://www.cnblogs.com/xym4869/p/12743591.html
Copyright © 2020-2023  润新知