【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 小时前
书籍将正方形矩阵顺时针转动90°(8)0605
线性代数·算法·矩阵
有梦想的骇客5 小时前
书籍“之“字形打印矩阵(8)0609
java·算法·矩阵
Chenyu_3105 小时前
12.找到字符串中所有字母异位词
c语言·数据结构·算法·哈希算法
苏三福5 小时前
yolo11-seg ultralytics 部署版本
算法·yolo11
yours_Gabriel5 小时前
【java面试】微服务篇
java·微服务·中间件·面试·kafka·rabbitmq
hashiqimiya7 小时前
android studio中修改java逻辑对应配置的xml文件
xml·java·android studio
achene_ql7 小时前
select、poll、epoll 与 Reactor 模式
linux·服务器·网络·c++
liuzhenghua667 小时前
Python任务调度模型
java·运维·python
結城7 小时前
mybatisX的使用,简化springboot的开发,不用再写entity、mapper以及service了!
java·spring boot·后端
小前端大牛马7 小时前
java教程笔记(十一)-泛型
java·笔记·python