杂题——字符串——试题 算法训练 二元函数

杂题——字符串——试题 算法训练 二元函数_第1张图片杂题——字符串——试题 算法训练 二元函数_第2张图片

 分析:

  • 关键在于,如果处理输入的字符串成表达式
  • 字符串分三种情况:
    • 如果 S 中只包含一个整数,则该整数就是表达式 S 的值;
    • 如果 S 中包含 f 函数,则递归计算 f 函数的参数,并将计算结果代入 f 函数中计算;
    • 如果 S 中包含括号,则递归计算括号中的表达式,并将计算结果作为新的表达式 S 计算。
  • 解析字符串,使用递归方法,从外向内,寻找f()函数的两个参数
package no1_1;
import java.util.*;

public class Main {
    static int a, b;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        a = scanner.nextInt();
        b = scanner.nextInt();
        scanner.nextLine();
        String s = scanner.nextLine();
        System.out.println(calculate(s));
    }

    private static int calculate(String s) {
        // 如果表达式 s 中只包含一个整数,则该整数就是表达式 s 的值
        if (s.matches("-?\\d+")) {
        	//使用正则表达式 -?\d+ 来匹配整数。其中 -? 表示可选的负号,\d+ 表示一个或多个数字
            return Integer.parseInt(s);
        }

        // 如果表达式 s 中包含 f 函数,则递归计算 f 函数的参数,并将计算结果代入 f 函数中计算
        if (s.startsWith("f(") && s.endsWith(")")) {
            int commaIndex = findCommaIndex(s.substring(2, s.length() - 1));//去掉f(),只传送里面的子串
            String arg1 = s.substring(2, 2 + commaIndex);//参数一
            String arg2 = s.substring(3 + commaIndex, s.length() - 1);//参数二
            int x = calculate(arg1);
            int y = calculate(arg2);
            return a * x + b * y;
        }

        // 如果表达式 s 中包含括号,则递归计算括号中的表达式,并将计算结果作为新的表达式 S 计算
        if (s.startsWith("(") && s.endsWith(")")) {
            return calculate(s.substring(1, s.length() - 1));
        }

        return 0;  // 永远不会执行到这里
    }
    //找到传进来的s的最外层f函数的两个参数的分隔逗号位置
    //比如要找f(1,f(1,-1))的两个参数,s为“1,f(1,-1)”,遇到第一个逗号就是了
    private static int findCommaIndex(String s) {
        int count = 0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '(') {
                count++;
            } else if (c == ')') {
                count--;
            } else if (c == ',' && count == 0) {
                return i;
            }
        }
        return -1;
    }
}

 

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