最近在练习算法,觉得CCF的算法题都还不错,就做了一下子。
- 试卷原题
- Java版解法
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//nextInt取循环的次数
int n = 0;
n = in.nextInt();
//这里必须要有一行in.nextLine();,将输入的n数量和实际的计算式隔开
in.nextLine();
String result[] = new String[n];
//循环N此
for (int i = 0; i < n; i++) {
//取输入的一行字符串
String s = in.nextLine();
ArrayList<String> list = new ArrayList<>();
//将这一行字符串的各个字符分割开来
for (int j = 0; j < 7; j++) {
list.add(s.substring(j,j+1));
}
result[i] = dealList(list);
}
for (int i = 0; i < n; i++) {
System.out.println(result[i]);
}
}
//递归处理List的值
private static String dealList(ArrayList<String> list) {
String result = "";
//当list中只剩下最后一个字符串运算时
if (list.size() == 3){
int num = deal(list.get(0),list.get(1),list.get(2));
if (num == 24){
result = "Yes";
}else {
result = "No";
}
return result;
}
//遍历这个list
for (int i = 0; i < list.size(); i++) {
//一进来,直接先遍历一边字符串,将其中的由x和/的优先计算
//当list.get(i)取得的字符是X和/时,需要进行优先计算
//例如3+4x5+6,当i取得到x的时候,需要先算4x5
//同时将i为x的值换成4x5=20的值,将原数组中的4和5去掉
if (list.get(i).equals("x") || list.get(i).equals("/")){
int dealNum = deal(list.get(i-1),list.get(i),list.get(i+1));
list.set(i, String.valueOf(dealNum));
//记住这里一定要先remove后面的值,再remove前面的值
list.remove(i+1);
list.remove(i-1);
//递归调用dealList进行处理,直到list的size为3
return dealList(list);
}
}
//当字符串中没有x和/的时候,先算第一个计算式
int dealNum = deal(list.get(0),list.get(1),list.get(2));
list.set(1,String.valueOf(dealNum));
//记住这里一定要先remove后面的值,再remove前面的值
list.remove(2);
list.remove(0);
return dealList(list);
}
/**
* 处理一个s和s2的运算,例如s+s2
* @param s
* @param s1
* @param s2
* @return
*/
private static int deal(String s, String s1, String s2) {
//取出两个数字
int a = Integer.parseInt(s);
int b = Integer.parseInt(s2);
if (s1.equals("+")){
return a+b;
}else if (s1.equals("-")){
return a-b;
}else if (s1.equals("x")){
return a*b;
}else {
return a/b;
}
}
}
PS:注意在输入的时候,一定要严格按照题目要求的格式,在所有的数据全部处理完毕后,一行一行输出结果,否则就会报错。
好啦,祝大家学习愉快。