题解 | #24点运算#注意边界#题中规律&数学规律两种解法

24点运算

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

import java.util.*;
import java.lang.*;
import java.util.stream.*;

// 看了python的算法,不得不感叹python工具的强大,拿来就能用,不过也奠定了使用者越来越上层,不理解算法的底层逻辑。
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String raw = in.nextLine();
        Map<String, Integer> map  = new HashMap<>();
        map.put("J", 11);
        map.put("Q", 12);
        map.put("K", 13);
        map.put("A", 1);
        String[] split = raw.split(" ");
        List<String> list_raw = new ArrayList<String>(Arrays.asList(split));
        String[] operator = {"+", "-", "*", "/"};
        List<String> result = new ArrayList<String>();
        combination(list_raw, operator, "", result);
        List<String> last = new ArrayList<String>();
        boolean status  = false;
        if (raw.contains("joker") || raw.contains("JOKER")) {
            System.out.println("ERROR");
        } else {
            for (String a : result) {
                int temp = decode_unusual(a, last);
                // int temp = decode(a, last);
                last.removeAll(last);
                if (temp == 24) {
                    System.out.println(a);
                    status = true;
                    break;
                }

            };
            if (status == false) {
                System.out.println("NONE");
            }
        }
    }
    public static int decode_unusual(String a, List last) {
        char[] c =  a.toCharArray();
        for (int i = 0; i < c.length; i++) {
            last.add(String.valueOf(c[i]));
        }
        calculate_unusual(last);
        return (int)last.get(0);
    }
    public static int decode(String a, List last) {
        char[] c =  a.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (c[i] == '*' || c[i] == '/') {
                calculate2(last, String.valueOf(c[i + 1]), c[i]);
                i = i + 1;
            } else {
                last.add(String.valueOf(c[i]));
            }
        }
        calculate1(last);
        return (int)last.get(0);
    }
    public static void calculate2(List last, String b, char operation ) {
        if (operation == '*') {
            int temp = recognize( String.valueOf(last.get(last.size() - 1))) * recognize(
                           b);
            int n = last.size();
            last.remove(last.size() - 1);
            last.add(temp);
        } else {
            int temp = recognize( String.valueOf(last.get(last.size() - 1))) / recognize(b);
            last.remove(last.size() - 1);
            last.add(temp);
        }
    }
    public static void  calculate1(List last) {
        int a = 0;
        for (int i = 0; i < last.size(); i++) {
            if (String.valueOf(last.get(i)).equals("+")) {
                int temp1 = recognize(String.valueOf(last.get(0))) != 0 ? recognize(
                                String.valueOf(last.get(0))) : Integer.parseInt(String.valueOf(last.get(0)));
                int temp2 = recognize(String.valueOf(last.get(i + 1))) != 0 ? recognize(
                                String.valueOf(last.get(i + 1))) : Integer.parseInt(String.valueOf(last.get(
                                            i + 1)));
                a = temp1 + temp2;
                last.set(0, a);
            } else if (String.valueOf(last.get(i)).equals("-")) {
                int temp1 = recognize(String.valueOf(last.get(0))) != 0 ? recognize(
                                String.valueOf(last.get(0))) : Integer.parseInt(String.valueOf(last.get(0)));
                int temp2 = recognize(String.valueOf(last.get(i + 1))) != 0 ? recognize(
                                String.valueOf(last.get(i + 1))) : Integer.parseInt(String.valueOf(last.get(
                                            i + 1)));
                a = temp1 - temp2;
                last.set(0, a);
            }
        }
    }
    public static void  calculate_unusual(List last) {
        int a = 0;
        for (int i = 0; i < last.size(); i++) {
            if (String.valueOf(last.get(i)).equals("+")) {
                int temp1 = recognize(String.valueOf(last.get(0))) != 0 ? recognize(
                                String.valueOf(last.get(0))) : Integer.parseInt(String.valueOf(last.get(0)));
                int temp2 = recognize(String.valueOf(last.get(i + 1))) != 0 ? recognize(
                                String.valueOf(last.get(i + 1))) : Integer.parseInt(String.valueOf(last.get(
                                            i + 1)));
                a = temp1 + temp2;
                last.set(0, a);
            } else if (String.valueOf(last.get(i)).equals("-")) {
                int temp1 = recognize(String.valueOf(last.get(0))) != 0 ? recognize(
                                String.valueOf(last.get(0))) : Integer.parseInt(String.valueOf(last.get(0)));
                int temp2 = recognize(String.valueOf(last.get(i + 1))) != 0 ? recognize(
                                String.valueOf(last.get(i + 1))) : Integer.parseInt(String.valueOf(last.get(
                                            i + 1)));
                a = temp1 - temp2;
                last.set(0, a);
            } else if (String.valueOf(last.get(i)).equals("*")) {
                int temp1 = recognize(String.valueOf(last.get(0))) != 0 ? recognize(
                                String.valueOf(last.get(0))) : Integer.parseInt(String.valueOf(last.get(0)));
                int temp2 = recognize(String.valueOf(last.get(i + 1))) != 0 ? recognize(
                                String.valueOf(last.get(i + 1))) : Integer.parseInt(String.valueOf(last.get(
                                            i + 1)));
                a = temp1 * temp2;
                last.set(0, a);
            } else if (String.valueOf(last.get(i)).equals("/")) {
                int temp1 = recognize(String.valueOf(last.get(0))) != 0 ? recognize(
                                String.valueOf(last.get(0))) : Integer.parseInt(String.valueOf(last.get(0)));
                int temp2 = recognize(String.valueOf(last.get(i + 1))) != 0 ? recognize(
                                String.valueOf(last.get(i + 1))) : Integer.parseInt(String.valueOf(last.get(
                                            i + 1)));
                a = temp1 / temp2;
                last.set(0, a);
            }

        }
    }
    public static void combination(List list_raw, String[] operator, String part,
                                   List result) {
        for (int i = 0; i < list_raw.size(); i++) {
            String a = (String)list_raw.get(i);
            if (list_raw.size() == 1) {
                part += a;
                result.add(part);
            } else {
                List<String> list_left = (List)list_raw.stream().collect(Collectors.toList());
                list_left.remove(a);
                for (int j = 0; j < operator.length; j++) {
                    String temp = part;
                    temp += a + operator[j];
                    combination(list_left, operator, temp, result);
                }
            }

        }
    }
    public static int recognize(String symbol) {
        int temp = 0;
        switch (symbol) {
            case "A":
                temp = 1;
                break;
            case "2":
                temp = 2;
                break;
            case "3":
                temp = 3;
                break;
            case "4":
                temp = 4;
                break;
            case "5":
                temp = 5;
                break;
            case "6":
                temp = 6;
                break;
            case "7":
                temp = 7;
                break;
            case "8":
                temp = 8;
                break;
            case "9":
                temp = 9;
                break;
            case "10":
                temp = 10;
                break;
            case "J":
                temp = 11;
                break;
            case "Q":
                temp = 12;
                break;
            case "K":
                temp = 13;
                break;
            default:
                temp = 0;
                break;
        }
        return temp;
    }

}

全部评论

相关推荐

群星之怒:不是哥们,你就不好奇瘫痪三十年的老植物人是啥样的吗?
点赞 评论 收藏
分享
04-13 18:10
门头沟学院 Java
想熬夜的小飞象在秋招:被腾讯挂了后爸妈以为我失联了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务