【2024华为OD-E卷-100分-火星文计算】(题目+思路+Java&C++&Python解析)

题目描述

给定一个火星文字符串和一个运算表达式,其中火星文字符串中的每个字符代表一个数字(0-9),并且运算表达式中可能包含火星文字符。要求计算这个表达式的值。

输入

  1. 第一行为一个火星文字符串,字符串中的每个字符唯一对应一个0-9之间的数字。
  2. 第二行为一个运算表达式,包含基本的四则运算(加 +,减 -,乘 *,除 /),以及火星文字符。

输出

输出运算表达式的结果。

示例

输入

abc
a+b*c

输出

假设a=1, b=2, c=3,则表达式 a+b*c = 1+2*3 = 7

思路

  1. 映射关系建立 :首先建立一个火星文字符到数字的映射关系。
  2. 表达式解析 :遍历运算表达式,将火星文字符替换为对应的数字。
  3. 计算表达式 :使用栈或内置的计算器库计算替换后的表达式。

Java 编码解析

import java.util.*;

public class MarsCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

// 读取火星文字符串
String marsStr = scanner.nextLine();

// 建立火星文字符到数字的映射
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < marsStr.length(); i++) {
char c = marsStr.charAt(i);
map.put(c, i);
}

// 读取运算表达式
String expression = scanner.nextLine();

// 替换火星文字符为数字
StringBuilder sb = new StringBuilder();
for (char c : expression.toCharArray()) {
if (map.containsKey(c)) {
sb.append(map.get(c));
} else {
sb.append(c);
}
}

// 计算表达式的值
try {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
Object result = engine.eval(sb.toString());
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}

scanner.close();
}
}

C++ 编码解析

#include <iostream>
#include <unordered_map>
#include <stack>
#include <sstream>
#include <cctype>
#include <cmath>

using namespace std;

int evaluateExpression(const string& expression) {
stack<int> values;
stack<char> ops;
for (char ch : expression) {
if (isdigit(ch)) {
int val = 0;
while (isdigit(ch)) {
val = val * 10 + (ch - '0');
ch = next(expression.begin(), distance(expression.begin(), find(expression.begin(), expression.end(), ch)) + 1); // Move to next char (ugly way due to single char iteration)
}
--ch; // Correct the overshoot
values.push(val);
} else if (ch == '(') {
ops.push(ch);
} else if (ch == ')') {
while (!ops.empty() && ops.top() != '(') {
int val2 = values.top(); values.pop();
int val1 = values.top(); values.pop();
char op = ops.top(); ops.pop();
switch (op) {
case '+': values.push(val1 + val2); break;
case '-': values.push(val1 - val2); break;
case '*': values.push(val1 * val2); break;
case '/': values.push(val1 / val2); break;
}
}
ops.pop(); // Pop '('
} else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
while (!ops.empty() && precedence(ops.top()) >= precedence(ch)) {
int val2 = values.top(); values.pop();
int val1 = values.top(); values.pop();
char op = ops.top(); ops.pop();
switch (op) {
case '+': values.push(val1 + val2); break;
case '-': values.push(val1 - val2); break;
case '*': values.push(val1 * val2); break;
case '/': values.push(val1 / val2); break;
}
}
ops.push(ch);
}
}
while (!ops.empty()) {
int val2 = values.top(); values.pop();
int val1 = values.top(); values.pop();
char op = ops.top(); ops.pop();
switch (op) {
case '+': values.push(val1 + val2); break;
case '-': values.push(val1 - val2); break;
case '*': values.push(val1 * val2); break;
case '/': values.push(val1 / val2); break;
}
}
return values.top();
}

int precedence(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0;
}

int main() {
string marsStr, expression;
getline(cin, marsStr);
getline(cin, expression);

unordered_map<char, int> map;
for (int i = 0; i < marsStr.size(); ++i) {
map[marsStr[i]] = i;
}

for (auto& ch : expression) {
if (map.find(ch) != map.end()) {
ch = '0' + map[ch];
}
}

cout << evaluateExpression(expression) << endl;

return 0;
}

Python 编码解析

def evaluate_expression(expression):
def precedence(op):
if op in ('+', '-'):
return 1
if op in ('*', '/'):
return 2
return 0

def apply_op(a, b, op):
if op == '+': return a + b
if op == '-': return a - b
if op == '*': return a * b
if op == '/': return a / b

values = []
ops = []
i = 0
while i < len(expression):
if expression[i].isdigit():
val = 0
while i < len(expression) and expression[i].isdigit():
val = val * 10 + int(expression[i])
i += 1
values.append(val)
i -= 1 # Correct the over-increment
elif expression[i] == '(':
ops.append(expression[i])
elif expression[i] == ')':
while ops and ops[-1] != '(':
val2 = values.pop()
val1 = values.pop()
op = ops.pop()
values.append(apply_op(val1, val2, op))
ops.pop() # Pop '('
elif expression[i] in ('+', '-', '*', '/'):
while ops and precedence(ops[-1]) >= precedence(expression[i]):
val2 = values.pop()
val1 = values.pop()
op = ops.pop()
values.append(apply_op(val1, val2, op))
ops.append(expression[i])
i += 1

while ops:
val2 = values.pop()
val1 = values.pop()
op = ops.pop()
values.append(apply_op(val1, val2, op))

return values[0]

if name == "main":
import sys
input = sys.stdin.read
data = input().split()

mars_str = data[0]
expression = data[1]

mapping = {c: i for i, c in enumerate(mars_str)}

for i, ch in enumerate(expression):
if ch in mapping:
expression = expression[:i] + str(mapping[

相关推荐
郝学胜-神的一滴5 分钟前
深入探索 C++ 元组:从基础到高级应用
开发语言·c++·stl·软件工程
mask哥14 分钟前
详解mcp以及agen架构设计与实现
java·微服务·flink·大模型·ai agent·springai·mcp
听情歌落俗26 分钟前
MATLAB3-1变量-台大郭彦甫
开发语言·笔记·算法·matlab·矩阵
Propeller33 分钟前
【Android】View 交互的事件处理机制
android·java
量子炒饭大师36 分钟前
收集飞花令碎片——C语言关键字typedef
c语言·c++·算法
杨杨杨大侠37 分钟前
Atlas Mapper 教程系列 (5/10):集合映射与嵌套对象处理
java·开源·github
ERP老兵_冷溪虎山38 分钟前
Python/JS/Go/Java同步学习(第十三篇)四语言“字符串转码解码“对照表: 财务“小南“纸式转码术处理凭证乱码崩溃(附源码/截图/参数表/避坑指南)
java·后端·python
是2的10次方啊38 分钟前
如何设计10万QPS秒杀系统?缓存+消息队列+分布式锁架构实战
java
心灵宝贝39 分钟前
Tomcat Connectors 1.2.37 源码编译安装教程(mod_jk 详细步骤)
java·tomcat
澡点睡觉41 分钟前
【数据结构与算法Trip第4站】摩尔投票法
算法