题解 | #24点运算#

24点运算

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

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String[] strs = scan.nextLine().split(" ");
        HashMap<String, Integer> StringToInteger = new HashMap<>();
        HashMap<Integer, String> IntegerToString = new HashMap<>();
        ArrayList<Integer> nums = new ArrayList<>();
        for (int i = 2; i <= 10; i++) {
            StringToInteger.put(String.valueOf(i), i);
            IntegerToString.put(i, String.valueOf(i));
        }
        StringToInteger.put("A", 1);
        StringToInteger.put("J", 11);
        StringToInteger.put("Q", 12);
        StringToInteger.put("K", 13);
        IntegerToString.put(1, "A");
        IntegerToString.put(11, "J");
        IntegerToString.put(12, "Q");
        IntegerToString.put(13, "K");
        for (String str : strs) {
            if ("joker".equals(str) || "JOKER".equals(str)) {
                System.out.println("ERROR");
                return;
            }
            nums.add(StringToInteger.get(str));
        }
        for (int num : nums) {
            ArrayList<Integer> copyArr = new ArrayList<>(nums);
            copyArr.remove(Integer.valueOf(num));
            // String tmp = process(String.valueOf(IntegerToString.get(num)), String.valueOf(num), copyArr, IntegerToString);
            String tmp = process(String.valueOf(IntegerToString.get(num)), num, copyArr, IntegerToString);
            if (!tmp.equals("NONE")) {
                System.out.println(tmp);
                return;
            }
        }
        System.out.println("NONE");
    }
    
    /**********************************************************************************/
    public static String process(String previousStr, int previousTotal, ArrayList<Integer> nums, HashMap<Integer, String> IntegerToString) {
        if (nums.size() == 0) {
            return previousTotal == 24 ? previousStr : "NONE";
        }
        for (int i = 0; i < nums.size(); i++) {
            int current = nums.get(i);
            ArrayList<Integer> copyArr = new ArrayList<>(nums);
            copyArr.remove(Integer.valueOf(current));
            String tmp = process(previousStr + "+" + IntegerToString.get(current), previousTotal + current, copyArr, IntegerToString);
            if (!tmp.equals("NONE")) {
                return tmp;
            }
            tmp = process(previousStr + "-" + IntegerToString.get(current), previousTotal - current, copyArr, IntegerToString);
            if (!tmp.equals("NONE")) {
                return tmp;
            }
            tmp = process(previousStr + "*" + IntegerToString.get(current), previousTotal * current, copyArr, IntegerToString);
            if (!tmp.equals("NONE")) {
                return tmp;
            }
            tmp = process(previousStr + "/" + IntegerToString.get(current), previousTotal / current, copyArr, IntegerToString);
            if (!tmp.equals("NONE")) {
                return tmp;
            }
        }
        return "NONE";
    }
    
    /**********************************************************************************/
    /*
    public static String process(String previousStr, String numsStr, ArrayList<Integer> nums, HashMap<Integer, String> IntegerToString) {
        if (nums.size() == 0) {
            return eval(numsStr) == 24 ? previousStr : "NONE";
        }
        for (int i = 0; i < nums.size(); i++) {
            int current = nums.get(i);
            ArrayList<Integer> copyArr = new ArrayList<>(nums);
            copyArr.remove(Integer.valueOf(current));
            String tmp = process(previousStr + "+" + IntegerToString.get(current), numsStr + "+" + current, copyArr, IntegerToString);
            if (!tmp.equals("NONE")) {
                return tmp;
            }
            tmp = process(previousStr + "-" + IntegerToString.get(current), numsStr + "-" + current, copyArr, IntegerToString);
            if (!tmp.equals("NONE")) {
                return tmp;
            }
            tmp = process(previousStr + "*" + IntegerToString.get(current), numsStr + "*" + current, copyArr, IntegerToString);
            if (!tmp.equals("NONE")) {
                return tmp;
            }
            tmp = process(previousStr + "/" + IntegerToString.get(current), numsStr + "/" + current, copyArr, IntegerToString);
            if (!tmp.equals("NONE")) {
                return tmp;
            }
        }
        return "NONE";
    }
    public static int eval(String str) {
        String[] strs = str.split("");
        LinkedList<String> ll = new LinkedList<>();
        for (String tmp : strs) {
            if ("+".equals(tmp) || "-".equals(tmp) || "*".equals(tmp) || "/".equals(tmp)) {
                ll.add(tmp);
            } else {
                if (!ll.isEmpty() && !"+".equals(ll.peekLast()) && !"-".equals(ll.peekLast()) && !"*".equals(ll.peekLast()) && !"/".equals(ll.peekLast())) {
                    String last = ll.peekLast();
                    ll.removeLast();
                    ll.add(last + tmp);
                } else {
                    ll.add(tmp);
                }
            }
        }
        Stack<String> stack = new Stack<>();
        LinkedList<String> suffix = new LinkedList<>();
        while (!ll.isEmpty()) {
            String tmp = ll.poll();
            if (!("+".equals(tmp) || "-".equals(tmp) || "*".equals(tmp) || "/".equals(tmp))) {
                suffix.add(tmp);
            } else {
                if ("*".equals(tmp) || "/".equals(tmp)) {
                    while (!stack.isEmpty() && !(stack.peek().equals("+") || stack.peek().equals("-"))) {
                        suffix.add(stack.pop());
                    }
                    stack.push(tmp);
                } else {
                    while (!stack.isEmpty()) {
                        suffix.add(stack.pop());
                    }
                    stack.push(tmp);
                }
            }
        }
        while (!stack.isEmpty()) {
            suffix.add(stack.pop());
        }
        int ans = 0;
        while (!suffix.isEmpty()) {
            String tmp = suffix.poll();
            if ("+".equals(tmp) || "-".equals(tmp) || "*".equals(tmp) || "/".equals(tmp)) {
                int num1 = Integer.valueOf(stack.pop());
                int num2 = Integer.valueOf(stack.pop());
                if ("+".equals(tmp)) {
                    ans = num2 + num1;
                } else if ("-".equals(tmp)) {
                    ans = num2 - num1;
                } else if ("*".equals(tmp)) {
                    ans = num2 * num1;
                } else {
                    ans = num2 / num1;
                }
                stack.push(String.valueOf(ans));
            } else {
                stack.push(tmp);
            }
        }
        return Integer.valueOf(stack.pop());
    }
    */
}
全部评论
该牛油正在参与牛客写题解薅羊毛的活动,牛币,周边,京东卡超多奖品放送,活动进入倒计时!,活动进入倒计时!快来捡漏啦https://www.nowcoder.com/discuss/888949?source_id=profile_create_nctrack&channel=-1
点赞 回复 分享
发布于 2022-04-26 19:06

相关推荐

不愿透露姓名的神秘牛友
05-28 12:15
点赞 评论 收藏
分享
代码飞升:别用口语,后端就写后端,前端就写前端,最后别光后悔
点赞 评论 收藏
分享
家人们,我现在真的好纠结。我是26届的,目前还没有实习过。我现在的情况是,想参加秋招,但是感觉自己的简历特别空,没有实习经历会不会秋招直接凉凉啊?可我又听说现在很多公司对26届实习生也不太感冒,说什么不确定性大。而且我最近在准备考公,时间上也有点冲突。要是把时间花在实习上,备考时间就少了。但要是不实习,又怕以后就业有问题😫有没有懂行的友友帮我分析分析:26届现在不实习,秋招找工作真的会很难吗?考公和实习该怎么平衡啊?如果现在不实习,考完公再去找实习还来得及吗?真的太焦虑了,希望大家能给我点建议🙏
小破站_程序员YT:我可能和大家的观点不一样。人的精力是有限的,不能既要还要。你又想实习又想考公最后又要秋招上岸,我觉得哪有那么多的选择。你如果想考上岸,那就全力以赴。如果想秋招上岸,就继续投实习,投没了,就继续准备秋招,秋招不行继续春招。别到最后,考公没上岸,觉得是花了时间浪费在找实习上了, 秋招没上岸,觉得是浪费时间准备考公去了。我是认为很难说可以去平衡 不喜勿喷,可以叫我删除
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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