华为od机试C卷-最长表达式求值

1 题目描述

提取字符串中的最长合法简单数学表达式子串,字符串长度最长的,并计算表达式的值,如果没有返回0。简单数学表达式只能包含以下内容0-9 数字,符号±*

说明:

1.所有数字,计算结果都不超过 long

2.如果有多个长度一样的,请返回第一个表达式的结果

3.数学表达式,必须是最长的,合法的

4.操作符不能连续出现,如 ±-+1 是不合法的

输入

字符串
输出

表达式值

示例一

输入: 1-2abcd

输出: -1

示例二

输入: 1-2abs1-2*3+7dd4-5+6

输出: 2

示例三

输入: a1/0+8d

输出: 8

2、审题

这道题有点难度,有以下几个难点:

1、如何找出字符串中的最长合法数学表达式子串?

2、如何计算该数学表达式子串的值?

3、四则运算有一种特殊情况,除数不为零,这种也必须考虑。

上述三个问题的对应解法:

1、用正则表达式筛选表达式。

2、用递归方法计算,主要优势代码简洁。

3、解法

java 复制代码
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
 
        String longStr = dealWith(str); //找到最长合法数学表达式子串
 
        if (!longStr.isEmpty()) {
            int result = calculate(longStr);
            System.out.println(result);
        } else {
            System.out.println(0);
        }
    }
 
    //判断字符串是否只有数字
    private static boolean isNumber(String str) {
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }
 
    //利用递归方法计算四则运算,这里+和-放在前面是有特殊原因,因为加法和减法的优先级低于乘法和除法
    private static int calculate(String str) {
        if (isNumber(str)) {
            return Integer.parseInt(str);
        }
 
        if (str.contains("+")) {
            int index = str.indexOf("+");
            return calculate(str.substring(0, index)) + calculate(str.substring(index + 1));
        }
 
        if (str.contains("-")) {
            int index = str.indexOf("-");
            return calculate(str.substring(0, index)) - calculate(str.substring(index + 1));
        }
 
        if (str.contains("*")) {
            int index = str.indexOf("*");
            return calculate(str.substring(0, index)) * calculate(str.substring(index + 1));
        }
 
        if (str.contains("/")) {
            int index = str.indexOf("/");
            return calculate(str.substring(0, index)) / calculate(str.substring(index + 1));
        }
        
        return 0;
    }
 
    //借助正则表达式拆出符合要求的表达式
    private static String dealWith(String str) {
        //将除数等于0时,表达式就不是合法的数学表达式,所以可以简单地用a0给替换,注意string是不可变量,所以要用新的变量代替
        String replaceStr = str.replace("/0", "a0");
 
        int max = 0;
        String longStr = "";
        String regex = "\\d+([\\+\\-*/]\\d+)+"; //这个正则表达式的意思:寻找以数字开头,+-*/其中之一紧随其后,而后又是一个数字的一个或者多个模式
 
        Pattern pattern= Pattern.compile(regex);
        Matcher matcher = pattern.matcher(replaceStr);
 
        while (matcher.find()) {
            String group = matcher.group();
            if (group.length() > max) {
                max = group.length();
                longStr = group;
            }
        }
        
        return longStr;
    }
}

网上很多要付费才能看到。

相关推荐
西电研梦1 天前
26西电考研 | 寒假开始,机试 or C语言程序设计怎么准备?
c语言·考研·华为od·研究生·西安电子科技大学·计算机408
无限码力2 天前
华为OD技术面真题 - Mysql相关 - 4
mysql·华为od·华为od技术面真题·华为od技术面八股·华为od技术面八股文·华为od技术面mysql相关
无限码力2 天前
华为OD机试双机位C卷 - FLASH坏块监测系统 (C语言 & C++ & Python & JAVA & JS & GO)
华为od·华为od机试真题·华为od机试双机位c卷·华为od上机考试双机位c卷·华为od上机考试真题·华为od机考真题·华为odflash坏块监测系统
无限码力2 天前
华为OD技术面真题 - 计算机网络相关 - 4
计算机网络·华为od·华为od技术面真题·华为od技术面计算机八股·华为od技术面计算机网络真题
想七想八不如114083 天前
2019机试真题
java·华为od·华为
开开心心_Every6 天前
家常菜谱软件推荐:分类齐全无广告步骤详细
linux·运维·服务器·华为od·edge·pdf·华为云
无限码力7 天前
华为OD2026最新机试双机位C卷机考真题目录含考点说明 (持续更新)
华为od·华为od机考·华为od题库·华为od机试·华为od机试双机位c卷·华为od最新上机考试题库·od机考题库
无限码力7 天前
华为OD技术面真题 - 数据库MySQL - 3
数据库·mysql·华为od·八股文·华为od技术面八股文
无限码力7 天前
华为OD技术面真题 - JAVA开发 - 5
java·华为od·面试·华为od技术面真题·华为od技术面八股·华为od技术面java八股文