题解 | #24点运算#
24点运算
http://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
/**
* 思路:先拿出一个数,与剩下的3个数分别进行加减乘除运算
* 对应剩下的3个数,同理,再拿出一个数,与剩下的2个分别进行加减乘除运算,依此类推
* 用total字段记录下前面几个值的计算结果,n表示前面计算了几个数
* 用str记录前面n个数计算的字符串
*/
public class Main {
static boolean hasChose = false; // 是否存在等于24的计算
static HashMap<String, Integer> map = new HashMap() {
{
put("A", 1);
put("2", 2);
put("3", 3);
put("4", 4);
put("5", 5);
put("6", 6);
put("7", 7);
put("8", 8);
put("9", 9);
put("10", 10);
put("J", 11);
put("Q", 12);
put("K", 13);
}
};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
hasChose = false;
String s = in.nextLine();
if (s.contains("joker") || s.contains("JOKER")) {
System.out.println("ERROR");
continue;
}
String[] sArr = s.split(" ");
find(0, 0, sArr, "");
if (!hasChose) {
System.out.println("NONE");
}
}
}
// total:前n个数计算结果,list:剩下4-n个数的集合,str:拼接的结果
private static void find(int total, int n, String[] arr, String str) {
if (hasChose) {
return;
}
if (n == 3) {
int nextValue = map.get(arr[0]);
if (total + nextValue == 24) {
hasChose = true;
System.out.println(str + "+" + arr[0]);
return;
}
if (total - nextValue == 24) {
hasChose = true;
System.out.println(str + "-" + arr[0]);
return;
}
if (total * nextValue == 24) {
hasChose = true;
System.out.println(str + "*" + arr[0]);
return;
}
if (total / nextValue == 24) {
hasChose = true;
System.out.println(str + "/" + arr[0]);
return;
}
return;
}
// 第一个循环,取一个值,将剩下的3个值放入一个新的数组,用于这个值和其他3个的结果进行加减乘除
for (int i = 0; i < arr.length; i++) {
String[] newArr = new String[arr.length - 1];
String num = "";
int start = 0;
for (int j = 0; j < arr.length; j++) {
if (i != j) {
newArr[start] = arr[j];
start++;
} else {
num = arr[i];
}
}
if (n == 0) {
find(map.get(num), n + 1, newArr, String.valueOf(num)); // 取到的第一个数不需要和前面的进行计算
} else {
find(total + map.get(num), n + 1, newArr, str + "+" + num);
find(total - map.get(num), n + 1, newArr, str + "-" + num);
find(total * map.get(num), n + 1, newArr, str + "*" + num);
find(total / map.get(num), n + 1, newArr, str + "/" + num);
}
}
}
}