题解 | #24点运算#

24点运算

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

import java.util.*;

// 全排序+经典回溯
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) { 
            System.out.println(f(in.nextLine()));
        }
    }

    public static String f(String poker) {
        String[] split = poker.split(" ");
        res = null;
        preSort(split, 0);
        return res == null ? "NONE" : res;
    }

    public static void preSort(String[] express, int idx) {
        if (res != null) return;
        if (idx >= 4) {
            if (map.containsKey(express[0])) {
                List<String> temp = new ArrayList<String>();
                temp.add(express[0]);
                count2(express, 1, temp, map.get(express[0]));
            } else {
                res = "ERROR";
                return;
            }
        }
        for (int i = idx; i < express.length; i++) {
            swap(express, i, idx);
            preSort(express, idx + 1);
            swap(express, i, idx);
        }
    }

    public static void swap(String[] e, int l, int r) {
        String temp = e[l];
        e[l] = e[r];
        e[r] = temp;
    }

    public static void count2(String[] poker, int idx, List<String> b, int v) {
        if (res != null) return;
        if (idx >= 4) {
            if (v == 24) {
                res = convert(b);
            }
            return;
        }
        for (int i = 0; i < 4; i++) {
                if (map.containsKey(poker[idx])) {
                    b.add(al[i] + "");
                    b.add(poker[idx]);
                    count2(poker, idx + 1, b, compute(v, map.get(poker[idx]), i));
                    b.remove((b.size() - 1));
                    b.remove(b.size() - 1);
                } else {
                    res = "ERROR";
                    return;
                }
        }

    }
    public static String convert(List<String> list) {
        StringBuilder b = new StringBuilder();
        for (String s : list) {
            b.append(s);
        }
        return b.toString();
    }

  	//分治 求有多少种结果,不是用来求此题的方案,但同为枚举表达式的方案技巧
    public static List<Integer> count(String[] e, int l, int r) {
        List<Integer> list = new ArrayList<Integer>();
        if (l == r) {
            list.add(map.get(e[l]));
            return list;
        }
        for (int i = l; i <= r; i++) {
            List<Integer> right = count(e, i + 1, r);
            List<Integer> left = count(e, l, i);
            for (Integer re : right) {
                for (Integer le : left) {
                    for (int j = 0; j < 4; j++) {
                        if (j == 3 && re == 0) {
                            continue;
                        } else {
                            list.add(compute(le, re, j));
                        }
                    }
                }
            }
        }
        return list;
    }

    public static int compute(int a, int b, int idx) {
        char e = al[idx];
        if (e == '+') {
            return a + b;
        } else if (e == '-') {
            return a - b;
        } else if (e == '*') {
            return a * b;
        } else {
            return a / b;
        }
    }

    static Map<String, Integer> map = new HashMap<>();
    static char[] al = {'+', '-', '*', '/'};
    static String res;
    static {
        map.put("A", 1);
        map.put("2", 2);
        map.put("3", 3);
        map.put("4", 4);
        map.put("5", 5);
        map.put("6", 6);
        map.put("7", 7);
        map.put("8", 8);
        map.put("9", 9);
        map.put("10", 10);
        map.put("J", 11);
        map.put("Q", 12);
        map.put("K", 13);
    }
}

全部评论

相关推荐

02-18 17:30
腾讯_TEG_技术
多刷**&nbsp;背八股&nbsp;刷面经&nbsp;项目话术准备好&nbsp;不会差的!!!后台看到好多小伙伴们都出现其中一个环节的错误,,,可惜了抓紧机会吧&nbsp;有的是hc&nbsp;但缺的就是稍微用心的人
野猪不是猪🐗:多刷星星,背八股背话术,真的能过你们?对一个个没实习过的学生狂问场景题设计题和底层深挖,别以为我不知道一边说缺人还一边各种kpi面
点赞 评论 收藏
分享
nbdy:字太多了,写简历不是写自传,亮点难点技能点列出来就行,要简明扼要
点赞 评论 收藏
分享
2024-12-29 11:08
湖南工业大学 Java
程序员牛肉:简历没什么大问题了。 而且不要再换项目了。三月份就开暑期实习了,现在都一月份了。实在来不及重新开一下项目了。把一个项目写完或许很快,但是把一个项目搞懂吃透并不简单。所以不要换项目了,把你简历上面的两个项目好好挖一挖吧。 具体 体现在:你能不能流利的说出你的项目的每一个功能点代码实现?你能不能说出在这块除了A技术之外,还有其他技术能够实现嘛?如果有其他技术能够实现,那你这块为什么选择了你当前用的这个技术?
投递牛客等公司
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务