华为OD机试 2024E卷题库疯狂收录中,刷题 <a rel="nofollow" href="https://blog.csdn.net/qq_40374604/category_12822407.html" style="color: red;">点这里</a>。
实战项目访问:http://javapub.net.cn/
专栏导读
本专栏收录于 《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》 。
刷的越多,抽中的概率越大,私信javapub,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
24点游戏算法
给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算。
此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。
输入描述:
读入4个[1,10]的整数,数字允许重复,测试用例保证无异常数字。
输出描述:
对于每组案例,输出一行表示能否得到24点,能输出true,不能输出false
示例1
输入
7 2 1 10
输出
true
Java 编程
package cn.net.javapub.demo2.demo;
/**
* @author: shiyuwang
* @url: http://javapub.net.cn
*/
import java.util.*;
import java.io.*;
public class Main {
private static int[] nums = new int[4];
private static boolean[] visit2 = new boolean[4];
private static int flag2 = 0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String[] a = in.nextLine().split(" ");
for (int i = 0; i < 4; i++)
nums[i] = Integer.parseInt(a[i]);
dfs3(0, 0, 0);
System.out.println(flag2 == 1);
flag2 = 0;
visit2 = new boolean[4];
}
}
private static boolean dfs3(int u, float tmp1, float tmp2) {
// 递归终止条件:已经使用了数组四个元素,两两运算,再互相运算同时结果为24,满足题意
if (tmp1 + tmp2 == 24 ||
tmp1 - tmp2 == 24 ||
tmp1 * tmp2 == 24 ||
tmp1 / tmp2 == 24 &&
u == 4) {
flag2 = 1; //成功找到运算组合
return true;
}
for (int i = 0; i < 4; i++) {
if (visit2[i] == false) { //当前数字没访问过
visit2[i] = true; //当前数字设为访问过
// 加减乘除当前数字num[i]
if (u < 2) { //对前两个数字运算
if (dfs3(u + 1, tmp1 + nums[i], 0)) { //四个数字运算完后不符合 返回false,不执行此if代码块
return true; //退出语句。
}
if (tmp1 != 0) { //0可以与后面做+,但不能与后面的数字做-*/。
if (dfs3(u + 1, tmp1 - nums[i], 0) ||
dfs3(u + 1, tmp1 * nums[i], 0) ||
dfs3(u + 1, tmp1 / nums[i], 0)) {
return true; //退出语句。
}
}
} else { //对后两个数字运算
if (dfs3(u + 1, tmp1, tmp2 + nums[i])) { //四个数字运算完后不符合 返回false,不执行此if代码块
return true; //退出语句。
}
if (tmp2 != 0) {
if (dfs3(u + 1, tmp1, tmp2 - nums[i]) ||
dfs3(u + 1, tmp1, tmp2 * nums[i]) ||
dfs3(u + 1, tmp1, tmp2 / nums[i])) {
return true; //退出语句。
}
}
}
// 四种运算都失败了,当前数字设为没访问过,相当于回溯
visit2[i] = false;
}
}
//四位数字都运算过了,且失败了。
return false;
}
}
展示效果:

🏆下一篇: 华为OD机试 - 查找两个字符串a,b中的最长公共子串 (Java 2024 E卷 100分) 🏆本文收录于, 搬砖工逆袭Java架构师
刷的越多,抽中的概率越大,私信javapub,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
优质合集推荐
《突击面试》Java面试题合集
《面试1v1》
《编程工作总结》

















