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

全部评论

相关推荐

头像
10-22 20:13
中南大学 Java
序言大家好呀。我是希晨er,一个初入职场的程序猿小登最近上班摸鱼刷到了一篇文章:10年深漂,放弃高薪,回长沙一年有感,还有聊聊30岁大龄程序员过往的心路历程,突然就有点感慨。我如今也做出了和大明哥一样的抉择,只是更早。此外我22年的人生,好像从来没好好记录过。正好现在工作不太忙,就想把这些经历写下来,也希望能得到社区里各位前辈的指点个人背景我是03年出生的西安娃,父母都是普通打工人。刚从中南大学软件工程专业毕业半年,现在在老家的央企过着躺平摆烂的日子成长轨迹从农村到城市的童年我家并不是西安的,只是爸妈在西安上班,从小学之后就把我接到了西安。后来老家房子拆了,爷爷奶奶也搬了过来。农村的生活,我觉...
Yki_:看哭了,恋爱那一段你女朋友说你不够关心她,可你毕竟也愿意遇到矛盾写几千字来和她慢慢分析;说不愿意给她花钱,我感觉可能只是消费观不一样;如果她想留在长沙,也应该提前跟你说开。不过她也许会心疼你放弃大厂offer转向数字马力?我也因为同样的原因有过一段幸福而充满遗憾的感情,不过跟爱情相比确实前途更重要一点。至于offer的选择,换我我也会这么选。把这些旧事记录下来以后,接下来就好好向前看吧,加油兄弟
🍊晨光随笔
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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