第十六次CCF认证模拟试题(201903-2):二十四点(Java完整版)

最近在练习算法,觉得CCF的算法题都还不错,就做了一下子。

  1. 试卷原题

第十六次CCF认证模拟试题(201903-2):二十四点(Java完整版)_第1张图片

  1. 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 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 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:注意在输入的时候,一定要严格按照题目要求的格式,在所有的数据全部处理完毕后,一行一行输出结果,否则就会报错。

好啦,祝大家学习愉快。

你可能感兴趣的:(算法,数据结构)