栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

算法提高 第五题 java 题解 1096

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

算法提高 第五题 java 题解 1096

第五题(15分)
题目描述
  实验室的王大神设计的机器人“学霸”掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。
  假设表达式可以简单定义为:
  1. 一个正的十进制数 x 是一个表达式。
  2. 如果 x 和 y 是 表达式,则 函数min(x,y)也是表达式,其值为x,y 中的最小数。
  3. 如果 x 和 y 是 表达式,则 函数max(x,y)也是表达式,其值为x,y 中的最大数。
  4.如果 x 和 y 是 表达式,则 函数add(x,y)也是表达式,其值为x,y 之和。
  例如, 表达式 max(add(1,2),7) 的值为 7。
  请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。

输入格式

  第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)
  接下来有N行, 每行是一个字符串,表示待求值的表达式
  (表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
  超过1000。)

输出格式

  输出有N行,每一行对应一个表达式的值。

样例输入

3
add(1,2)
max(1,999)
add(min(1,1000),add(100,99))

样例输出

3
999
200

解题思路:

由于存在嵌套语句,可以每算出一层嵌套就将答案与嵌套语句做替换,当最后字符串中只有数字字符时便是最终答案。注意在判断完一层都需要退回开头重新计算。由于求解三个表达式的过程相同,所以该程序存在冗余语句。

java代码:
import java.io.*;

public class Main {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		String []str = new String[n];
		for(int i = 0;i < n;i++) {
			str[i] = br.readLine();
		}
		for(int i = 0; i < n;i++) {
			int j = 0,l = 0,r = 0;
			StringBuilder builder = null;
			while(true) {
				int f;
				boolean flag = true;
				for(f = 0; f < str[i].length() ;f++) {//判断是否还有嵌套语句
					if(!Character.isDigit(str[i].charAt(f)))
						break;
				}
				if(f == str[i].length()) {
					break;
				}
				char t = str[i].charAt(j);
				if(t == 'a') {
					l = j;
					j = j + 4;//跳过语句“(add”,正好四个字符
					if(!Character.isDigit(str[i].charAt(j))) {//内层有嵌套,重新判断
						continue;
					}
					builder = new StringBuilder();
					while(Character.isDigit(str[i].charAt(j))) {//拼接整数
						builder.append(str[i].charAt(j));
						j++;
					}
					int a = Integer.parseInt(builder.toString());
					j++;//跳过逗号
					builder = new StringBuilder();
					while(Character.isDigit(str[i].charAt(j))) {
						builder.append(str[i].charAt(j));
						j++;
						flag = false;
					}
					r = j;
					if(flag) {//逗号后仍有嵌套
						continue;
					}
					int b = Integer.parseInt(builder.toString());
					String sum = a + b + "";
					builder = new StringBuilder(str[i]);
					builder.delete(l, r + 1);//删除原嵌套语句
					builder.insert(l, sum);//换成运算结果
					str[i] = builder.toString();
					j = 0;//退回开始
				}else if(t == 'm' && str[i].charAt(j + 1) == 'a') {
					l = j;
					j = j + 4;
					if(!Character.isDigit(str[i].charAt(j))) {
						continue;
					}
					builder = new StringBuilder();
					while(Character.isDigit(str[i].charAt(j))) {
						builder.append(str[i].charAt(j));
						j++;
					}
					int a = Integer.parseInt(builder.toString());
					j++;
					builder = new StringBuilder();
					while(Character.isDigit(str[i].charAt(j))) {
						builder.append(str[i].charAt(j));
						j++;
						flag = false;
					}
					r = j;
					if(flag) {
						continue;
					}
					int b = Integer.parseInt(builder.toString());
					String sum = (a > b ? a : b) + "";
					builder = new StringBuilder(str[i]);
					builder.delete(l, r + 1);
					builder.insert(l, sum);
					str[i] = builder.toString();
					j = 0;
				}else if(t == 'm' && str[i].charAt(j + 1) == 'i') {
					l = j;
					j = j + 4;
					if(!Character.isDigit(str[i].charAt(j))) {
						continue;
					}
					builder = new StringBuilder();
					while(Character.isDigit(str[i].charAt(j))) {
						builder.append(str[i].charAt(j));
						j++;
					}
					int a = Integer.parseInt(builder.toString());
					j++;
					builder = new StringBuilder();
					while(Character.isDigit(str[i].charAt(j))) {
						builder.append(str[i].charAt(j));
						j++;
						flag = false;
					}
					r = j;
					if(flag) {
						continue;
					}
					int b = Integer.parseInt(builder.toString());
					String sum = (a > b ? b : a) + "";
					builder = new StringBuilder(str[i]);
					builder.delete(l, r + 1);
					builder.insert(l, sum);
					str[i] = builder.toString();
					j = 0;
				}else {
					j++;
				}
			}
		}
		for(String s : str) {
			System.out.println(s);
		}
	}
}
提交截图: 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/324530.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号