华为OD机试 - 符号运算 - 递归(Java 2024 C卷 100分)

news2024/11/22 15:16:12

在这里插入图片描述

华为OD机试 2024C卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

给定一个表达式,求其分数计算结果

表达式的限制如下:

  1. 所有的输入数字皆为正整数(包括0)
  2. 仅支持四则运算(±*/)和括号
  3. 结果为整数或分数, 分数必须化为最简格式(比如6, 3/4, 7/8, 90/7)
  4. 除数可能为0,如果遇到这种情况,直接输出"ERROR"
  5. 输入和最终计算结果中的数字都不会超出整型范围

用例的输入一定合法, 不会出现括号不匹配的情况

二、输入描述

字符串格式的表达式,仅支持±*/,数字可能超过两位,可能带有空格,没有负数

长度小于200个字符

三、输出描述

表达式结果,以最简格式表达 如果结果为整数,那么直接输出整数 如果结果为分数,那么分子分母不可再约分,可以为假分数,不可表达为带分数 结果可能是负数, 负号放在最前面

1、输入

1 / (0-5)

2、输出

-1/5

四、解题思路

此问题需要处理一个包含四则运算和括号的数学表达式,并正确处理分数和除法。关键步骤如下:

1、解析和计算表达式:

使用递归或栈来处理括号和操作符的优先级。
支持整数和分数的四则运算。

2、处理分数:

对于每次运算结果,若为分数,则需要化简(约分)。
使用两个整数表示分数(分子和分母),并在每次运算后使用最大公约数(GCD)来约分。

3、错误处理:

当遇到除数为零的情况,立即返回"ERROR"。

4、表达式结果格式:

如果分母为1,则输出整数。
如果不为1,则输出最简分数格式。
确保分数的符号只出现在分子上。

五、Java算法源码

通过递归函数 eval() 来计算和解析包含括号的表达式。它支持基本的四则运算,并正确处理分数和整数。当除数为零时,它会捕获ArithmeticException并返回"ERROR"。

public class OdTest01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String expression = sc.nextLine();
        String result = evaluate(expression);
        System.out.println(result);
    }

    private static String evaluate(String expression) {
        try {
            // 清除表达式中的空格
            expression = expression.replaceAll(" ", "");
            // 计算表达式结果
            BigInteger[] result = eval(expression, 0, expression.length());
            // 处理并格式化结果输出
            if (result[1].equals(BigInteger.ZERO)) {
                return "ERROR";  // 遇到除数为零
            } else if (result[1].equals(BigInteger.ONE)) {
                return result[0].toString();  // 结果为整数
            } else {
                return result[0] + "/" + result[1];  // 输出最简分数
            }
        } catch (ArithmeticException e) {
            return "ERROR";
        }
    }

    // 解析并计算表达式
    private static BigInteger[] eval(String s, int start, int end) {
        // 分子和分母
        BigInteger numerator = BigInteger.ZERO;
        BigInteger denominator = BigInteger.ONE;

        BigInteger currentNumerator = BigInteger.ZERO;
        BigInteger currentDenominator = BigInteger.ONE;

        char lastOp = '+';

        for (int i = start; i < end; i++) {
            char ch = s.charAt(i);

            if (ch >= '0' && ch <= '9') {
                // 数字的处理
                int j = i;
                while (j < end && Character.isDigit(s.charAt(j))) j++;
                currentNumerator = new BigInteger(s.substring(i, j));
                currentDenominator = BigInteger.ONE;
                i = j - 1;
            } else if (ch == '(') {
                // 括号的处理
                int count = 1;
                int j = i + 1;
                while (j < end && count != 0) {
                    if (s.charAt(j) == '(') count++;
                    if (s.charAt(j) == ')') count--;
                    j++;
                }
                BigInteger[] res = eval(s, i + 1, j - 1);
                currentNumerator = res[0];
                currentDenominator = res[1];
                i = j - 1;
            } else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
                // 运算符的处理
                if (lastOp == '+') {
                    numerator = numerator.multiply(currentDenominator).add(currentNumerator.multiply(denominator));
                    denominator = denominator.multiply(currentDenominator);
                } else if (lastOp == '-') {
                    numerator = numerator.multiply(currentDenominator).subtract(currentNumerator.multiply(denominator));
                    denominator = denominator.multiply(currentDenominator);
                } else if (lastOp == '*') {
                    numerator = numerator.multiply(currentNumerator);
                    denominator = denominator.multiply(currentDenominator);
                } else if (lastOp == '/') {
                    numerator = numerator.multiply(currentDenominator);
                    denominator = denominator.multiply(currentNumerator);
                }
                // 约分
                BigInteger gcd = numerator.gcd(denominator);
                numerator = numerator.divide(gcd);
                denominator = denominator.divide(gcd);

                // 更新最后的操作符
                lastOp = ch;
                currentNumerator = BigInteger.ZERO;
                currentDenominator = BigInteger.ONE;
            }
        }

        // 处理最后的运算符
        if (lastOp == '+') {
            numerator = numerator.multiply(currentDenominator).add(currentNumerator.multiply(denominator));
            denominator = denominator.multiply(currentDenominator);
        } else if (lastOp == '-') {
            numerator = numerator.multiply(currentDenominator).subtract(currentNumerator.multiply(denominator));
            denominator = denominator.multiply(currentDenominator);
        } else if (lastOp == '*') {
            numerator = numerator.multiply(currentNumerator);
            denominator = denominator.multiply(currentDenominator);
        } else if (lastOp == '/') {
            numerator = numerator.multiply(currentDenominator);
            denominator = denominator.multiply(currentNumerator);
        }

        // 约分
        BigInteger gcd = numerator.gcd(denominator);
        numerator = numerator.divide(gcd);
        denominator = denominator.divide(gcd);

        // 确保分母总是正数
        if (denominator.compareTo(BigInteger.ZERO) < 0) {
            denominator = denominator.negate();
            numerator = numerator.negate();
        }

        return new BigInteger[] {numerator, denominator};
    }
}

六、效果展示

1、输入

1 * (3*4/(8-(7+0)))

2、输出

12

3、说明

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷+C卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1644449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

头歌Hadoop 开发环境搭建及HDFS初体验(第2关:配置开发环境 - Hadoop安装与伪分布式集群搭建)

第1关&#xff1a;配置开发环境 - JavaJDK的配置 第2关&#xff1a;配置开发环境 - Hadoop安装与伪分布式集群搭建 第3关&#xff1a;HDFS系统初体验 注&#xff1a; 1 头歌《Hadoop 开发环境搭建及HDFS初体验》三关在一个实验环境下&#xff0c;需要三关从前往后按顺序评测…

【Mac】 DSync for mac(文件比较同步工具) v2.7安装教程

软件介绍 DSync是一款文件比较同步工具&#xff0c;通过简便的三步即可完成繁琐的比较、同步操作&#xff0c;您甚至可以通过跳过、删除或反转您选择的文件的复制方向来微调您的同步。这是在Mac上同步文件的最简单方法。 安装教程 1.打开安装包&#xff0c;将「DSync」拖到右…

RK3568 学习笔记 : u-boot 下通过设置 env ethact 设置当前工作的以太网设备

前言 正点原子 &#xff1a;RK3568 开发板 atompi-ca1 默认有两个网口&#xff0c;通过 u-boot mii 命令&#xff0c;可以查看 网口信息 > mii device MII devices: ethernetfe010000 ethernetfe2a0000 Current device: ethernetfe010000u-boot 下的以太网&#xff0c;不同…

功能描述如何逻辑

assign相当于连线&#xff0c;注意每个assign独立&#xff0c;如果有变化立刻变化

go mod

常用命令 初始化模块 go mod init 模块名下载 go.mod 文件中指明的所有依赖 go mod download github.com/gin-gonic/ginv1.9.(依赖路径)依赖对其&#xff08;使引用的都是所依赖的&#xff09; go mod tidy编辑go.mod go mod edit go mod edit -require"github.com/g…

uniapp 使用renderjs的一些详细介绍

一、简介 官方链接&#xff1a;uniapp官网中的renderjs方法的详细介绍 二、renderjs 定义 renderjs是一个运行在视图层的js。它比WXS更加强大。它只支持app-vue和web。 作用&#xff1a; 大幅降低逻辑层和视图层的通讯损耗&#xff0c;提供高性能视图交互能力。在视图层操作d…

jvm重要参数可视化和线上问题排查

jvm重要参数可视化和线上问题排查 目标jvm参数分类(了解)运行时数据区相关的&#xff08;jdk1.8&#xff09;处理 OOM 相关的垃圾回收器相关的GC 日志记录相关的意义,默认值,调优原则&#xff08;重要&#xff0c; 待拆分&#xff09; 排查 OOM 流程 和 常见原因参考文章 目标 …

书生浦语训练营第三次课笔记:XTuner 微调 LLM:1.8B、多模态、Agent

Finetune 简介 两种Finetune范式&#xff1a;增量预训练微调、指令跟随微调 微调数据集 上述是我们所期待模型回答的内容&#xff0c;在训练时损失的计算也是基于这个。 训练数据集看起来是这样&#xff0c;但是真正喂给模型的&#xff0c;是经过对话模板组装后的 下图中&…

tomcat+nginx 动静分离

一、单机反向代理 7-1 7-2 测试 二、多机反向代理 1. 环境准备 机器IP地址服务7-1172.168.1.11nginx7-2172.168.1.12tomcat7-3172.168.1.13tomcat 2. 配置7-1 Nginx 服务器 vim /apps/nginx/conf/nginx.confhttp:upstream tomcat {server 172.168.1.12:8080;server …

优化理论复习——(三)

本篇介绍无约束优化的问题&#xff0c;通过四种算法来进行求解的过程和思路&#xff0c;也是最优化方法中的最重要的一类问题。 无约束优化问题主要是通过迭代搜索算法来切结&#xff0c;比线性规划的计算量都小一点。 目录 无约束优化问题最优性条件最速下降法牛顿法共轭梯度…

Vue踩坑,less与less-loader安装,版本不一致

无脑通过npm i less -D安装less之后&#xff0c;继续无脑通过npm i less-loader -D安装less-loader出现如下错误&#xff1a; 解决方法&#xff1a; 1) npm uninstall less与 npm uninstall less-loader 2) 直接对其版本&#xff1a; npm i less3.0.4 -D npm i less-loader…

渠道管控治理思路建议

品牌在做控价时&#xff0c;一定要有渠道一体化的治理想法&#xff0c;不能只能打击某一家店铺为想法进行治理&#xff0c;比如只打击非授权&#xff0c;只不去管理授权体系的经销商店铺&#xff0c;这显然是不行的&#xff0c;管理非授权的同时&#xff0c;授权也要管理好&…

QT+网络调试助手+TCP客户端

一、网络调试助手UI界面 编程主要思路&#xff1a; 首先将水平的控件 水平布局 &#xff0c;然后相对垂直的控件 垂直布局 &#xff0c;哪怕是底下的groupBox也需要和里面的内容 水平布局&#xff0c;然后最后框选全部 栅格布局。如果需要界面自适应窗口大小&#xff0c…

基于TL431的线性可调恒压恒流电源的Multisim电路仿真设计

1、线性电源的工作原理 在我们日常应用里&#xff0c;直流电是从市电或电网中的交流电获取的。例如15V直流电压源、24V直流电压源等等。交流电变为直流电的过程大概分为一下几步&#xff1a; 首先&#xff0c;交流电通过变压器降低其电压幅值。接着&#xff0c;经过整流电路进…

【Axure高保真原型】拖动穿梭选择器

今天和大家分享拖动穿梭选择器的原型模板&#xff0c;我们可以拖动两个选择器里的选项标签&#xff0c;移动到另外一个选择器里。那这个原型模板是用中继器制作的&#xff0c;所以使用也很方便&#xff0c;只需要在中继器表格里填写选项信息&#xff0c;即可自动生成交互效果&a…

SiteServer 插件之 用户登录插件-用户注册

1、请确保已经安装了“用户登录插件”,如下图。 2、 显示管理->包含文件管理->include/header.html->编辑,如下图。 3、代码如下。 <header><div class="wrap"><div class="top-box clearfix"><div class="left-box…

【AI】openai-quickstart 运行Jupyter Lab

openai-quickstart/openai_api /README-CN.md 【AI】指定python3.10安装Jupyter Lab 可以安装3.10版本的jupyter lab 但是直接输入命令无法启动 突然发现自己电脑2023年安装过anaconda3 C:\ProgramData\anaconda3\python.exe C:\ProgramData\anaconda3\cwp.py C:\ProgramData…

、、、、、

、、 、 transient 关键字总结 1&#xff09;transient修饰的变量不能被序列化&#xff1b;2&#xff09;transient只作用于实现 Serializable 接口&#xff1b;3&#xff09;transient只能用来修饰普通成员变量字段&#xff1b;4&#xff09;不管有没有 transient 修饰&…

ESP32-C3 Wi-Fi STA模式打通(1)

本文内容参考&#xff1a; ESP32 (WIFI)-AP、STA模式(14)_wifi接口 wifi_ap_channel_set-CSDN博客 【ESP-IDF】ESP32利用wifi联网&#xff08;STA模式&#xff09;_esp32ap和sta-CSDN博客 Wi-Fi 库 - ESP32 - — ESP-IDF 编程指南 latest 文档 特此致谢&#xff01; 一、概…

西奥机电食品质构仪与米饭软硬度的口感探秘

西奥机电食品质构仪与米饭软硬度的口感探秘 米饭&#xff0c;作为日常餐桌上的主角&#xff0c;其口感的好坏往往决定了整个用餐体验。其中&#xff0c;米饭的软硬度更是决定其口感的关键。今天&#xff0c;我们将借助西奥机电的食品质构仪&#xff0c;一同探秘米饭软硬度的口…