火星符号运算 - 华为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…

代码随想录算法——数组

目录 1、二分查找法 2、移除元素 3、有序数组的平方 4、长度最小的子数组 5、螺旋矩阵II 1、二分查找法 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在…

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"

Acwing154滑动窗口

theme: channing-cyan 题目 给定一个大小为 n≤10^6 的数组。 有一个大小为 k 的滑动窗口&#xff0c;它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子&#xff1a; 该数组为 [1 3 -1 -3 5 3 6 7]&#x…

【回溯算法】LCR 079. 子集

LCR 079. 子集 解题思路 初始化一个空的列表 res 来存储所有子集&#xff0c;并初始化一个空的列表 track 来跟踪当前正在构建的子集。 定义一个名为 subsets 的方法&#xff0c;该方法接受一个整数数组 nums 作为输入。此方法作为生成子集的入口点。 在 subsets 方法内部&a…

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 图数据挖掘与分析的多领域应用…

Vue3富文本组件UEditor ,vue-ueditor-wrap@3.x

一、Vue 中UEditor 2.0版本跟3.0版本不兼容 重点安装版本不同 使用详细介绍&#xff1a; vue-ueditor-wrap - Vue UEditor v-model双向绑定 二、安装流程 1.安装 # vue-ueditor-wrap v3 仅支持 Vue 3 npm i vue-ueditor-wrap3.x -S # or yarn add vue-ueditor-wrap3.x …

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

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

测试:JMeter如何获取非json格式的响应参数

JMeter如何获取非json格式的响应参数 在 JMeter 中获取非 JSON 格式的响应参数通常涉及使用后置处理器来提取这些参数。以下是一些常见的方法来获取不同类型的响应数据&#xff1a; 正则表达式提取器&#xff1a; 适用于提取文本、HTML、XML 等格式中的特定文本。使用正则表达…

docker compose部署mall

安装环境软件 1.拉取镜像 docker pull mysql:5.7 docker pull redis:7 docker pull nginx:1.22 docker pull rabbitmq:3.9-management docker pull elasticsearch:7.17.3 docker pull kibana:7.17.3 docker pull logstash:7.17.3 docker pull mongo:4 docker pull minio/mini…

Linux开发:PAM2 配置文件

PAM配置文件是用于粘合应用程序和PAM服务模块,通过其中的配置,可以动态的选择PAM服务模块,从而增加认证的可配置性和灵活性。 PAM配置文件通常保存在/etc/pam.d/目录下,当应用程序进行认证时,会选择对应的PAM配置文件,而PAM配置文件又对PAM服务具体使用哪些模块(动态链…

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

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

【推荐算法】userid是否需要建模

看到一个din的源码&#xff0c;将userid也构建了emb table。 于是调研了一下。即推荐算法需要建模userid吗&#xff1f; 深度学习推荐算法中user-id和item-id是否需要放入模型中作为特征进行训练呢&#xff1f; 深度学习推荐算法中user-id和item-id是否需要放入模型中作为特…

Linux查询指令

查看物理CPU型号&#xff1a; cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 查看物理CPU个数 cat /proc/cpuinfo| grep “physical id”| sort| uniq| wc -l 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo| grep “cpu cores”| uniq 查看逻辑CPU的…

Zookeeper集群搭建(3台)

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