网友的解法都很复杂,我的思路很简单,就是每次随机从集合中取出两个数字,然后进行加减乘除的运算,得出的结果再放到新的集合中,然后跟剩下没有参与运算的数字继续dfs。直到找到一个等于24的为止。

import java.util.Scanner;

import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        String[] s = line.split(" ");
        ArrayList<Double> list = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            list.add(Double.parseDouble(s[i]));
        }
        System.out.println(dfs_HJ67(list));
    }

    /**
    * 每次从集合中取出两个数字做加减乘除,直到剩余一个数字,返回最后的数字是否等于24点;
    *
    * @param nums 需要计算的数字集合
    * @return true表示等于24
    */
    private static boolean dfs_HJ67(ArrayList<Double> nums) {
        //判断如果nums只剩下一个数字,且结果为24,则通过
        if (nums.size() == 1 && nums.get(0).equals(24d)) {
            return true;
        }
        //遍历所有可能性,取出其中两个数字,并进行加减乘除
        double num1, num2;
        for (int i = 0; i < nums.size(); i++) {
            for (int j = i + 1; j < nums.size(); j++) {
                //取出两个数字,j的取值范围是[i+1, nums.size()),避免重复计算
                num1 = nums.get(i);
                num2 = nums.get(j);
                //进行加减乘除运算,返回计算结果集合
                List<Double> resultList = calc(num1, num2);
                //移除这两个数字,剩下的数字参与下一次dfs
                ArrayList<Double> remainList = new ArrayList<>(nums);
                remainList.remove(i);
                remainList.remove(j - 1);//i移除后,j的坐标会往前移动一位
                for (Double aDouble : resultList) {
                    ArrayList<Double> newList = new ArrayList<>(remainList);
                    newList.add(aDouble);
                    if (dfs_HJ67(newList)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    /**
     * 两个数字做加减乘除,返回所有的结果集
     */
    private static List<Double> calc(double num1, double num2) {
        ArrayList<Double> resultList = new ArrayList<>();
        //加法
        resultList.add(num1 + num2);
        //减法
        resultList.add(num1 - num2);
        resultList.add(num2 - num1);
        //乘法
        resultList.add(num1 * num2);
        //除法,除数不能为0
        if (num2 != 0) {
            resultList.add(num1 / num2);
        }
        if (num1 != 0) {
            resultList.add(num2 / num1);
        }
        return resultList;
    }
}