【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[

相关推荐
graceyun5 分钟前
牛客网刷题 ——C语言初阶(5操作符)——BC90 矩阵计算
c语言·算法·矩阵
SuperSwaggySUP24 分钟前
挑战春招找到java后端实习第三天(1.4)
java·开发语言
confident330 分钟前
阶梯费用计算demo
java·前端·javascript
攒了一袋星辰30 分钟前
从零开始自搭SpringBoot项目 -- Qingluopay项目工程介绍
java·spring boot·后端
莹雨潇潇31 分钟前
约瑟夫问题
数据结构·c++·算法
Java 第一深情35 分钟前
面试题解,Java中的“对象”剖析
java·jvm
Mr.kanglong1 小时前
【递归、搜索与回溯】二叉树的深搜
数据结构
花仙子1661 小时前
C#运动控制系统:雷赛控制卡实用完整例子 C#雷赛开发快速入门 C#雷赛运动控制系统实战例子 C#快速开发雷赛控制卡
开发语言·算法·c#
怀念无所不能的你1 小时前
洛谷P5318 【深基18.例3】查找文献(c嘎嘎)
算法
AmosCloud20131 小时前
3.5 字典树(Trie)与后缀树
开发语言·数据结构·链表·c#