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