题解 | #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;

    }

}

全部评论

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务