当前位置: 首页 > article >正文

【2024华为OD-E卷-100分-火星文计算】(题目+思路+JavaC++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[
 


http://www.kler.cn/a/470917.html

相关文章:

  • GOAT‘S AI早鸟报Part9
  • UDP -- 简易聊天室
  • php反序列化 ctf例题演示 框架安全(TP,Yii,Laravel) phpggc生成框架利用pop
  • 数值分析速成复习笔记
  • C# 服务生命周期:Singleton、Scoped、Transient
  • 微服务保护—Sentinel快速入门+微服务整合 示例: 黑马商城
  • 网络物理互连
  • 固定资产管理系统|Java|SSM|VUE| 前后端分离
  • qemu-kvm使用简介
  • js逆向实战(1)-- 某☁️音乐下载
  • Docker 中启动 Nacos
  • Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)
  • 普及组集训数据结构--并查集
  • 学习threejs,导入AWD格式的模型
  • iOS实现在collectionView顶部插入数据效果
  • 分布式IO模块:激光切割机产线高效控制的创新引擎
  • c# 中Parallel.ForEach 对其中一个变量进行赋值 引发报错
  • 计算机网络•自顶向下方法:多址接入协议
  • 【AI数学基础】线性代数:向量空间
  • reactor的Hooks.enableAutomaticContextPropagation();不生效解决方案
  • 基于32单片机的智能语音家居
  • pytest日志显示
  • gesp(C++一级)(18)洛谷:B4063:[GESP202412 一级] 奇数和偶数
  • 某制造集团灯塔工厂解决方案(36页PPT)
  • 安装vue脚手架出现的一系列问题
  • 计算机网络——网络层—路由算法和路由协议