题解 | #24点运算#

24点运算

https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d

使用DFS + 牌随机排序尝试计算50次

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息

public class Main {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        while (in.hasNextLine()) {

            String inputData = in.nextLine();

            if(inputData.contains("joker") || inputData.contains("JOKER")) {

                System.out.println("ERROR");

                return;

            }

            String[] paiArray = inputData.split(" ");

            int tryCalNum = 0;

            boolean opResult = false;

            while(!opResult && tryCalNum < 50) {//暂时猜测计算50次一定得出结果,超出50次说明不能计算出24

                String[] paiRandomArray = new String[paiArray.length];//保存牌的随机顺序值

                int[] randomArray = getRandom();

                for(int i = 0; i < paiRandomArray.length; i ++) {

                    paiRandomArray[i] = paiArray[randomArray[i]];

                }

                int lastCalResult = getPaiRealVal(paiRandomArray[0]);

                StringBuilder opeSb = new StringBuilder();

                opResult = dfs(paiRandomArray, 0, lastCalResult, opeSb);

                opeSb.insert(0, paiRandomArray[0]);

                if(opResult) {

                    //计算成功24

                    System.out.println(opeSb.toString());

                    break;

                }

                tryCalNum ++;

            }

            if(!opResult) {

                System.out.println("NONE");

            }

        }    

    }

    //深度优先搜索算法

    private static boolean dfs(String[] paiArray, int index, int lastCalResult, StringBuilder opeSb) {

        if(index == paiArray.length - 1 && lastCalResult == 24) {

            return true;

        }

        if(index + 1 <= paiArray.length - 1) {

            //加

            boolean result = dfs(paiArray, index + 1, lastCalResult + getPaiRealVal(paiArray[index + 1]), opeSb);

            if(result) {

                opeSb.insert(0, "+" + paiArray[index + 1]);

                //opeSb.append(getPaiRealVal(paiArray[index + 1]));

                return result;

            }

            //减

            result = dfs(paiArray, index + 1, lastCalResult - getPaiRealVal(paiArray[index + 1]), opeSb);

            if(result) {

                opeSb.insert(0, "-" + paiArray[index + 1]);

                //opeSb.append(getPaiRealVal(paiArray[index + 1]));

                return result;

            }

            //乘

            result = dfs(paiArray, index + 1, lastCalResult * getPaiRealVal(paiArray[index + 1]), opeSb);

            if(result) {

                opeSb.insert(0, "*" + paiArray[index + 1]);

                //opeSb.append(getPaiRealVal(paiArray[index + 1]));

                return result;

            }

            //除

            int divResult = lastCalResult / getPaiRealVal(paiArray[index + 1]);

            int ysResult = lastCalResult % getPaiRealVal(paiArray[index + 1]);

            if(ysResult == 0) {

                //能被整除

                result = dfs(paiArray, index + 1, divResult, opeSb);

            } else {

                result = false;

            }

            if(result) {

                opeSb.insert(0, "/" + paiArray[index + 1]);

                //opeSb.append(getPaiRealVal(paiArray[index + 1]));

                return result;

            }

        }

        return false;

    }

    //获取牌的实际值

    public static int getPaiRealVal(String pai) {

        int result = 0;

        switch(pai) {

            case "2":

            case "3":

            case "4":

            case "5":

            case "6":

            case "7":

            case "8":

            case "9":

            case "10": result = Integer.valueOf(pai); break;

            case "J":  result = 11; break;

            case "Q":  result = 12; break;

            case "K":  result = 13; break;

            case "A":  result = 1; break;

        }

        return result;

    }

    //随机生成4个0到3不同的数

    public static int[] getRandom() {

        int[] resultData = new int[4];

        boolean[] findFlag = new boolean[4];

        int calData = (int)(Math.random() * (3 - 0 + 1) + 0);

        for(int i = 0; i < resultData.length; i ++) {

            while(findFlag[calData]) {

                calData = (int)(Math.random() * (3 - 0 + 1) + 0);

            }

            findFlag[calData] = true;

            resultData[i] = calData;

        }

        return resultData;

    }

}

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:52
点赞 评论 收藏
分享
10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
accaacc:2到4k,不是2k到4k,所以年薪是30块
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务