【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) {
mapmarsStr\[i] = i;
}

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

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 expressioni.isdigit():
val = 0
while i < len(expression) and expressioni.isdigit():
val = val * 10 + int(expressioni)
i += 1
values.append(val)
i -= 1 # Correct the over-increment
elif expressioni == '(':
ops.append(expressioni)
elif expressioni == ')':
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 expressioni in ('+', '-', '*', '/'):
while ops and precedence(ops-1) >= precedence(expressioni):
val2 = values.pop()
val1 = values.pop()
op = ops.pop()
values.append(apply_op(val1, val2, op))
ops.append(expressioni)
i += 1

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

return values0

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

mars_str = data0
expression = data1

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[

相关推荐
我不会起名字3224 分钟前
一天一道力扣Hot100(36):深度优先算法---组合总和
数据结构·c++·后端·python·算法·go
海鸥-w7 分钟前
spingboot定义一个全局异常处理器
java
纪念 2298 分钟前
c++类和对象(四)
开发语言·c++
曹牧19 分钟前
Jackson 反序列化字段名不匹配
java
汉克老师20 分钟前
GESP2026年9月认证C++六级( 第三部分编程题(2、分树规划))精讲
c++·gesp·小学生·学c++编程
学生小羊26 分钟前
C++ 初阶 学习博客
c语言·c++·c++与c语言的区别·c++基础学习
雨落在了我的手上30 分钟前
Java数据结构(十五):哈希表
数据结构
虚无的纽扣31 分钟前
【力扣刷题】第三天:有效三角形的个数、快乐数
算法·排序算法
名字还没想好☜34 分钟前
Spring Boot 优雅停机实战:等在途请求处理完再退出,配合 K8s preStop 别丢请求
java·后端·spring
tiger86534 分钟前
大语言模型面试和题解,Context Engineering 怎么做?长 Prompt、动态上下文与 Memory 管理
人工智能·深度学习·算法·语言模型·自然语言处理·面试·nlp