火星符号运算 - 华为OD统一考试

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

已知火星人使用的运算符号为 #$

其与地球人的等价公式如下

x#y=2*x+3*y+4
x$y=3*x+y+2
  1. x y是无符号整数。
  2. 地球人公式按照c语言规则进行计算。
  3. 火星人公式中,# 号的优先级高于 $ ,相同的运算符,按从左往右的顺序计算

现有一段火星人的字符串报文,请你来翻译并计算结果

输入描述

火星人的字符串表达式(结尾不带回车换行)

输入的字符串说明:字符串为仅无符号整数和操作符(#、$)组成的计算表达式,例如:123#4​$5#67$78

  1. 用例保证字符串中,操作数与操作符之间没有任何分隔符

  2. 用例保证操作数取值范围为 3232 为无符号整数

  3. 保证输入以及计算结果不会出现int整数溢出

  4. 保证输入的字符串为合法的求值报文,例如:123#4$5#67​$78

  5. 保证不会出现非法的求值报文,例如类似这样字符串:

    #4$5 //缺少操作数
    4$5# //缺少操作数
    4#$5 //缺少操作数
    4 $5 //有空格
    3+4-5*6/7 //有其他操作符
    1234567897654321$54321 //32位整数计算溢出
    

输出描述

根据输入的火星人字符串输出计算结果(结尾不带回车换行)

示例1

输入:
7#6$5#12输出:
157说明:
7#6$5#12
=(4*7+3*6+2)$5#12
=48$5#12
=48$(4*5+3*12+2)
=48$58
=2*48+58+3
=157

题解

解题思路:

  1. 题目要求对火星人的字符串表达式进行翻译并计算结果,其中火星人的运算符为 #$,并给出了等价的地球人公式。
  2. 使用栈来模拟计算过程,遍历字符串,遇到数字则累积,遇到运算符则进行相应的计算。
  3. 定义优先级,按照规定的优先级顺序进行计算。
  4. 最终栈中的结果即为计算结果。

代码大致描述:

  1. 使用栈 nums 存储数字,栈 ops 存储运算符,变量 t 用于临时存储数字。
  2. 定义操作符的优先级 priority
  3. 定义一个计算的函数 calc,用于出栈计算,并根据运算符进行相应的计算。
  4. 遍历字符串,遇到数字则累积到 t 中,遇到运算符则将 t 压入 nums,并根据优先级进行出栈计算。
  5. 遍历结束后,将 t 压入 nums
  6. 最后,根据运算符的优先级,进行出栈计算直到操作符栈为空,返回栈顶元素作为最终结果。

Java

import java.util.*;
/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();System.out.print(solve(input));}public static int solve(String s) {// 数据栈, 操作符栈, 数字临时变量Stack<Integer> nums = new Stack<>();Stack<Character> ops = new Stack<>();int t = 0;// 操作符优先级HashMap<Character, Integer> priority = new HashMap<>();priority.put('#', 2);priority.put('$', 1);// 进行出栈计算Runnable calc = () -> {int y = nums.pop(),  x = nums.pop();char op = ops.pop();if (op == '#') {nums.push(4 * x + 3 * y + 2);} else {nums.push(2 * x + y + 3);}};for (char c : s.toCharArray()) {if (Character.isDigit(c)) {t = t * 10 + Character.getNumericValue(c);continue;}nums.push(t);// 相同优先级或之前优先级高则出栈计算while (!ops.isEmpty() && priority.get(ops.peek()) >= priority.get(c)) {calc.run();}ops.push(c);t = 0;}nums.push(t);// 出栈计算, 直到操作符栈为空while (!ops.isEmpty()) {calc.run();}return nums.peek();}
}

Python

def solve(s: str) -> int:# 数据栈, 操作符栈, 数字临时变量nums, ops, t = [], [], 0# 操作符优先级priority = {'#': 2, '$': 1}def calc():  # 进行出栈计算y, x = nums.pop(), nums.pop()op = ops.pop()if op == '#':nums.append(4 * x + 3 * y + 2)else:nums.append(2 * x + y + 3)for c in s:if c.isdigit():t = t * 10 + int(c)continuenums.append(t)# 相同优先级或之前优先级高则出栈计算while ops and priority[ops[-1]] >= priority[c]:calc()ops.append(c)t = 0nums.append(t)# 出栈计算, 直到操作符栈为空while ops:calc()return nums[-1]print(solve(input()))

C++

#include <iostream>
#include <stack>
#include <unordered_map>using namespace std;int solve(string s) {// 数据栈, 操作符栈, 数字临时变量stack<int> nums;stack<char> ops;int t = 0;// 操作符优先级unordered_map<char, int> priority;priority['#'] = 2;priority['$'] = 1;// 进行出栈计算auto calc = [&]() {int y = nums.top();        nums.pop();int x = nums.top();        nums.pop();char op = ops.top();        ops.pop();if (op == '#') {nums.push(4 * x + 3 * y + 2);} else {nums.push(2 * x + y + 3);}};for (char c : s) {if (isdigit(c)) {t = t * 10 + (c - '0');continue;}nums.push(t);// 相同优先级或之前优先级高则出栈计算while (!ops.empty() && priority[ops.top()] >= priority[c]) {calc();}ops.push(c);t = 0;}nums.push(t);// 出栈计算, 直到操作符栈为空while (!ops.empty()) {calc();}return nums.top();
}int main() {string input;getline(cin, input);cout << solve(input);return 0;
}

相关练习题

题号题目难易
LeetCode 227227. 基本计算器 II中等
LeetCode 224224. 基本计算器困难

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

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

相关文章

心情切换器(仅供娱乐)

本次分享主要内容较为新奇&#xff0c;作用程度可以说没用&#xff0c;仅供娱乐(注&#xff1a;本次成果使用的为vue框架实现) 一、静态及呈现图 <div class"switchMood"><h2>心情转换器</h2><!--输入当前心情表单--><div class"fr…

LM403-Pro-Kit数据手册

如上图所示&#xff0c;LM403-Pro-Kit评估板由ST-LINK、跳线、LM403模组、按键、LED以及天线接口等组成。 USB连接PC即可以在线仿真、下载和串口打印调试输出、输入操作。 电源开关 控制LM403模组的电源与LDO的3.3V的通断。 MicroUSB 板子供电及ST-LINK与PC机连接的接口。 S…

Java多线程:线程安全

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、线程状态1、New&#xff08;初始状态&#xff09;2、Terminated&#xff08;终止状态&#xff09;3、Runnable&#xff08;…

以管理员权限删除某文件夹

到开始菜单中找到—命令提示符—右击以管理员运行 使用&#xff1a;del /f /s /q “文件夹位置” 例&#xff1a;del /f /s /q "C:\Program Files (x86)\my_code\.git"

Flink从入门到实践(二):Flink DataStream API

文章目录 系列文章索引三、DataStream API1、官网2、获取执行环境&#xff08;Environment&#xff09;3、数据接入&#xff08;Source&#xff09;&#xff08;1&#xff09;总览&#xff08;2&#xff09;代码实例&#xff08;1.18版本已过时的&#xff09;&#xff08;3&…

《MySQL 简易速速上手小册》第9章:高级 MySQL 特性和技巧(2024 最新版)

文章目录 9.1 使用存储过程和触发器9.1.1 基础知识9.1.2 重点案例&#xff1a;使用 Python 调用存储过程实现用户注册9.1.3 拓展案例 1&#xff1a;利用触发器自动记录数据更改历史9.1.4 拓展案例 2&#xff1a;使用 Python 和触发器实现数据完整性检查 9.2 管理和查询 JSON 数…

VBA技术资料MF117:测试显示器大小

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

图论与图数据应用综述:从基础概念到知识图谱与图智能

目录 前言1 图论基础概念1.1 节点度1.2 度分布1.3 邻接矩阵 2 探索图的高级概念2.1 最短路径的关键性2.2 图的直径与平均路径的意义2.3 循环与路径类型的多样性 3 深入探讨图的广泛应用领域3.1 知识图谱的知识管理3.2 图智能在复杂决策中的应用3.3 图数据挖掘与分析的多领域应用…

[C#]winform制作仪表盘好用的表盘控件和使用方法

【仪表盘一般创建流程】 在C#中制作仪表盘文案&#xff08;通常指仪表盘上的文本、数字或指标显示&#xff09;涉及到使用图形用户界面&#xff08;GUI&#xff09;组件&#xff0c;比如Windows Forms、WPF (Windows Presentation Foundation) 或 ASP.NET 等。以下是一个使用W…

APEX开发过程中需要注意的小细节2

开发时遇到首次获取租户号失败的问题 以为是触发顺序问题&#xff0c;所以设置两个动态操作&#xff0c;一个事件是“更改”&#xff0c;另一个是“单击”&#xff0c; 但还是没有解决&#xff0c; 后来终于找到解决方法:在校验前执行取值 果然成功执行&#xff01; 动态查询年…

Zookeeper集群搭建(3台)

准备工作 1、提前安装好hadoop102、hadoop103、hadoop104三台机器&#xff0c;参照&#xff1a;CentOS7集群环境搭建&#xff08;3台&#xff09;-CSDN博客 2、提前下载好Zookeeper安装包并上传到/opt/software上、安装包&#xff0c;链接&#xff1a;https://pan.baidu.com/…

图书系统的Web实现(含源码)

源码地址https://gitee.com/an-indestructible-blade/project 注意事项&#xff1a; BorrowBooksWeb\src\main\resources路径下的application.yml文件里面的url&#xff0c;username&#xff0c;password这三个属性和自己的数据库保持一致。 浏览器访问url:http://127.0.0.1:…

软考 系统分析师系列知识点之信息系统战略规划方法(4)

接前一篇文章&#xff1a;软考 系统分析师系列知识点之信息系统战略规划方法&#xff08;3&#xff09; 所属章节&#xff1a; 第7章. 企业信息化战略与实施 第4节. 信息系统战略规划方法 7.4.2 关键成功因素法 关键成功因素&#xff08;Critical Success Factors&#xff0c…

Unity3D学习之UI系统——UGUI

文章目录 1. 前言2 六大基础组件概述3 Canvas——渲染模式的控制3.1 Canvas作用3.2 Canvas的渲染模式3.2.1 Screen Space -Overlay 覆盖模式3.2.2 Screen Space - Camera 摄像机模式3.2.3 World Space 4 CanvasScaler ——画布缩放控制器4.1 Constant Pixel Size 恒定像素模式4…

考研数据结构笔记(5)

单链表的查找 按位查找(O(n))按值查找(O(n))单链表长度(O(n))小结 基于带头结点的代码 按位查找(O(n)) 按值查找(O(n)) 单链表长度(O(n)) 小结

五官行为检测(表情基)解决方案提供商

随着人工智能技术的日益成熟&#xff0c;情感识别与行为分析在企业界的应用逐渐广泛。美摄科技作为业内领先的五官行为检测&#xff08;表情基&#xff09;解决方案提供商&#xff0c;致力于为企业提供高效、精准的情感识别与行为分析服务。 美摄科技的五官行为检测&#xff0…

【lesson47】进程通信之system V(共享内存)补充知识

文章目录 补充知识 补充知识 进行通信的key值问题&#xff0c;进程要通信的对方进程怎么能保证对方能看到&#xff0c;并且看到的就是该进程创建的共享内存的。 所以就通过key值来标识共享内存&#xff0c;key值是几不重要&#xff0c;只要在系统里是唯一的即可。 这样server和…

CentOS7集群配置免密登录

准备工作 提前开启三台虚拟机hadoop102、hadoop103,hadoop104,关于三台虚拟机的安装可以参考&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/136010108 配置免密登录 一、分别修改三台机器的hosts,配置主机映射关系 vim /etc/hosts 文件中输入以下内容&#xf…

利用Pybind11封装Python版的WiringPi!

原版的WiringPi是一个用于树莓派的GPIO库&#xff0c;用C语言开发&#xff0c;仓库地址&#xff1a;https://github.com/WiringPi/WiringPi。该库允许用户以编程方式访问和控制树莓派的GPIO引脚。而随着Python在嵌入式设备上的快速发展&#xff0c;其对底层引脚的操作也变得越来…

linux系统定时任务管理

crontab使用 一、crontab简介 crontab 这个指令所设置的工作将会循环的一直进行下去&#xff01;可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外&#xff0c;亦可编辑 /etc/crontab 来支持。 至于让 crontab 可以生效的服务则是 crond 这个服…