字符串四则运算表达式的计算(华为机试)

如何在华为OD机试中获得满分?Java实现【四则运算】一文详解! ✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 输入一个表达式(用字符串表示),求这个表达式的值。保证字符串中的有效字符包括。且表达式一定合法。数据范围:表达式计算结果和过程中满足,字符串长度满足 。输入一个算术表达式。得到计算结果。 5. 测试 阅读详情

          最近做了一道华为的机试题。感觉自己的方法比网上的简洁。

3. 简单四则运算
问题描述:
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注
1、表达式只含 +, -, *, / 四则运算符,不含括号
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况

要求实现函数:
int calculate(int len,char *expStr)

【输入】  int len: 字符串长度;
char *expStr: 表达式字符串;
【输出】  无
【返回】  计算结果

示例
1)  输入:char *expStr = “1+4*5-8/3”
函数返回:19
2)  输入:char *expStr = “8/3*3”
函数返回:6*/

#include <stdio.h>
#include <memory>
#include <string.h>
/*****************************************/
//这个算法开辟了额外的空间。
//分析这个问题可以知道,字符串长度len是奇数(0不考虑)
//数字的个数是len/2+1,符号的个数为len/2,然后将符号和数字存储起来
//第一步处理所有的乘除法,此时有一个特点就是如果几个数
//连续进行乘除法的时候就需要向前存储结果(为了方便后面的加减法运算)
//算法复杂度O(n)
/*****************************************/
int calculate(int len,char *expStr)
{	
	int i,j,k,answer;
	int* num=(int*)malloc((len/2+1)*sizeof(int));
	char* exp=(char*)malloc(len/2);
	for (i=0,j=0,k=0;i<len;i++)          //将符号和数字分开存储
	{
		if(i%2==0)
			num[j++]=expStr[i]-'0';
		else
			exp[k++]=expStr[i];
	}
	//乘除法处理
	for (i=0,j=1;i<len/2;i++)
	{
		if (exp[i]!='*'&&exp[i]!='/')
		{
			j=1;
			continue;
		}
		if (exp[i]=='*')
		{
			num[i+1]*=num[i];
			for (k=0;k<j;k++)
			{
				num[i-k]=num[i+1];
			}
			j++;
		}
		else if (exp[i]=='/')
		{
			num[i+1]=num[i]/num[i+1];
			for (k=0;k<j;k++)
			{
				num[i-k]=num[i+1];
			}
			j++;
		}
	}
	//处理加减法
	answer=num[0];
	for (i=0,j=1;i<len/2;i++)
	{
		if (exp[i]=='+')
			answer+=num[i+1];
		else if (exp[i]=='-')
			answer-=num[i+1];
	}
	return answer;
}

int main()
{
	char* a="1+4*5-8/3*2*2*2";
	int result=calculate(strlen(a),a);
	//int result=calculate2(strlen(a),a);
	printf("%d",result);
	return 0;
}

//网上的答案,用栈进行操作
int calculate2(int len,char *expStr)  
{  
    struct  {  
        char opdata[200];  
        int top;  
    }opstack;  
    //定义操作符栈   
  
    opstack.top = -1;  
  
    int i=0;//遍历字符串的下标   
    int t=0;//当前后缀表达式的长度   
  
    char ch = expStr[i];  
  
    while (ch!='\0')  
    {  
        switch (ch)  
        {  
            case '+':  
            case '-':  
			   while (opstack.top != -1)  
			   {  
                    expStr[t] = opstack.opdata[opstack.top];  
                    opstack.top--;  
                    t++;  
                }  
                opstack.top++;  
               opstack.opdata[opstack.top] = ch;  
                break;  
            case '/':  
                while (opstack.top != -1 && (opstack.opdata[opstack.top] =='*' || opstack.opdata[opstack.top] =='/') )  
                {  
                    expStr[t] = opstack.opdata[opstack.top];  
                    opstack.top--;  
                    t++;  
                }  
                opstack.top++;  
                opstack.opdata[opstack.top] = ch;  
                break;  
            default:  
                expStr[t] = ch;  
                t++;  
                break;  
        }  
        i++;  
        ch = expStr[i];  
    }  
  
    while (opstack.top != -1)//将栈中所有的剩余的运算符出栈   
    {  
        expStr[t] = opstack.opdata[opstack.top];  
        opstack.top--;  
        t++;  
    }  
  
    expStr[t]='\0';  
  
  
    struct  {  
        int numeric[200];  
        int top;  
    }data;  
  
    data.top = -1;  
  
    i=0;  
    ch = expStr[i];  
  
  
    while (ch!='\0')  
    {  
        if (ch>='0' && ch <= '9' )  
        {  
            data.top++;  
            data.numeric[data.top] = ch-'0';  
        }   
        else if('+' == ch)  
        {  
            int tmp = data.numeric[data.top-1]  + data.numeric[data.top];  
            data.top--;  
            data.numeric[data.top] = tmp;  
        }  
        else if('-' == ch)  
        {  
            int tmp = data.numeric[data.top-1]  - data.numeric[data.top];  
            data.top--;  
            data.numeric[data.top] = tmp;  
        }  
        else if('*' == ch)  
        {  
            int tmp = data.numeric[data.top-1]  * data.numeric[data.top];  
            data.top--;  
            data.numeric[data.top] = tmp;  
        }  
        else if('/' == ch)  
       {  
            if(data.numeric[data.top] == 0)  
            {  
                printf("cannot be zero of the divide\n");  
                exit(1);  
            }  
            int tmp = data.numeric[data.top-1] / data.numeric[data.top];  
            data.top--;  
            data.numeric[data.top] = tmp;  
        }  
        i++;  
        ch = expStr[i];  
    }  
  
    return data.numeric[data.top];  
}


 

   

【华为机试真题Java】四则运算 数据范围:表达式计算结果和过程中满足 |val| \le 1000 \∣val∣≤1000 ,字符串长度满足 1 \le n \le 1000 \1≤n≤1000。保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。输入一个表达式(用字符串表示),求这个表达式的值。 阅读详情

相关推荐

【华为OD机试真题 双机位A卷】938、符号运算 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS)

【华为OD机试真题 双机位A卷】938、符号运算 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为od

KJ.JK 858

字符串四则运算表达式求值

1. 后缀表达式 对于四则运算表达式,如 10+20-3*(10-5)+8 ,我们如何用程序实现这个运算表达式求值呢?可以使用 一种不需要括号的后缀表达法,我们也称为逆波兰(RPN)表示,如上面的例子 10+20-3*(10-5)+8,使用后缀表示法就变成了这样 10 20 + 3 10 5 - * - 8 + 我们把这样的式子称为后缀表达式,叫后缀的原因为 所有的符号都在要运算数字的后面,那么...

不会飞的纸飞机的博客 2057

【华为OD机试真题 Java语言】441、符号运算 | 机试真题+思路参考+代码解析(C卷)

题目描述 >给定一个表达式,求其分数计算结果 >  表达式的限制如下:   1、所有的输入数字皆为正整数(包括0)   2、仅支持四则运算(+-*/)和括号   3、结果为整数或分数,分数必须化为最简格式(比如6,3/4,7/8,90/7)   4、除数可能为0,如果遇到这种情况,直接输出"ERROR"   5、输入和最终计算结果中的数字都不会超出整型范围  

KJ.JK 1944

3.2四则运算

例3-5:求解 简单的四则运算表达式,输入一个形式如操作数 运算符 操作数的死者运算表达式,输出运算结果。 #include <stdio.h> int main() { double value1, value2; char c; printf("Enter an expression");//提示输入一个表达式 scanf("%lf%c%lf", &...

qq_45969772的博客 1883

【华为OD机试真题 JS语言】441、符号运算 | 机试真题+思路参考+代码解析(C卷)

题目描述 >给定一个表达式,求其分数计算结果 >  表达式的限制如下:   1、所有的输入数字皆为正整数(包括0)   2、仅支持四则运算(+-*/)和括号   3、结果为整数或分数,分数必须化为最简格式(比如6,3/4,7/8,90/7)   4、除数可能为0,如果遇到这种情况,直接输出"ERROR"   5、输入和最终计算结果中的数字都不会超出整型范围  

KJ.JK 1694

AUTOSAR/汽车行业

AUTOSAR架构及汽车产业链相关介绍

m0_54254513的博客 1万+

字符串四则运算

解析字符串形式的表达式,求解四则运算 要求: 所有数字都是1-9的个位数 运算符包括+、-、*、/、(、和) 运算中间结果和最终结果为double类型解题思路:

小虾米的专栏 2063

Evolution of Heuristics: Towards Efficient Automatic Algorithm Design Using Large Language Model

启发式算法广泛用于处理复杂的搜索和优化问题。然而,启发式算法的手动设计通常非常耗费人力,需要丰富的工作经验和知识。本文提出了启发式算法的进化 (EoH),这是一种新颖的进化范式,它利用大型语言模型 (LLM) 和进化计算 (EC) 方法进行自动启发式设计 (AHD)。EoH 代表自然语言中的启发式概念,称为思想。然后由 LLM 将它们转换为可执行代码。进化搜索框架中思想和代码的演变使其在生成高性能启发式算法方面非常有效和高效。

weixin_43961909的博客 2159

数学四则运算

#include <stdio.h> #include <math.h> void fun(char,double,double); void main() { char signal; double x; double y; while (1) { printf("请输入第一个数 : "); scanf("%lf",&x); loop...

weixin_34054931的博客 178

ROS2零拷贝避坑指南:Fast DDS共享内存配置常见问题与排查方法

本文深入解析ROS2 Humble中Fast DDS的零拷贝机制,提供共享内存配置的常见问题排查方法。从环境变量设置、XML配置文件到运行时诊断工具,全面指导开发者高效实现进程间数据传输优化,避免低效拷贝问题。特别针对/dev/shm无文件生成等典型场景给出解决方案。

weixin_30379531的博客 477

CCS TMSC6748 报错Error connecting to the target: (Error -600 @ 0x0)

CCS TMSC6748 报错Error connecting to the target:(Error -600@ 0x0)

AS_the_deer1717的博客 6632

计算器

题目描述 给定一个字符串形式的计算表达式,其中只包含数字和加+、减-、乘*、除/四种运算符,乘除计算优先级高于加减。 请对该计算表达式求值,并返回计算结果。如果在计算过程中遇到除零,则返回字符串error。 解答要求 时间限制: 1000ms, 内存限制: 64MB 输入输出 输入 一个字符串形式的计算表达式,长度范围:[1,100] 用例保证,输入数字和中间及最终计算结果的值都是整数,且在int型范围内。 输出 一个10进制整数; 或字符串error 样例 输入样例1 1+2*3-100/2 输出样例1

weixin_41563161的博客 895

开发者体验度量:构建DevEx评估体系的方法论与工具

在深入讨论度量方法前,我们需要明确什么是开发者体验(DevEx)。许多人将其简化为"开发工具好不好用",这是一个危险的误解。开发者体验是指开发者在完成工作过程中的整体感受和效率,它由三大核心维度组成:工具与基础设施:开发、测试、部署工具链的效能流程与协作:工作流程的顺畅度和团队协作的效率文化与成长:支持实验、学习和专业发展的环境这三个维度相互作用,共同决定了开发者能否高效且愉悦地完成工作。开发者体验不是一个目的地,而是一段持续的旅程。

2401_88760782的博客 1428

华为机试HJ50 四则运算

华为机试HJ50 四则运算 题目描述 请实现如下接口 /* 功能:四则运算 * 输入:strExpression:字符串格式的算术表达式,如: “3+2*{1+2*[-4/(8-6)+7]}” * 返回:算术表达式的计算结果 / public static int calculate(String strExpression) { / 请实现*/ return 0; } 输入描述: 输入一个算术表达式 输出描述: 得到计算结果 示例1 输入 3+2*{1+2*[-4/(8-6)+7]} 输出 25 #inc

qq_39299692的博客 631

微信小程序启用蓝牙设备特征值变化时的notify功能

注意:这里的serviceUUID、notifyCharacteristicUUID 我会在后面写入数据时做重点说明。isNotifyBLECharacteristic:false, //是否启用蓝牙设备服务特征 notify。二、启用蓝牙设备特征值变化时的notify功能。下一篇 将继续介绍 微信小程序蓝牙设备写入数据。

wsk198726的专栏 1171

电容式三点式振荡电路/电感式三点振荡电路基础知识及Multisim电路仿真

摘要:三极管振荡电路利用放大特性与正反馈实现自激振荡,需满足巴克豪森条件(增益≥1,相位匹配)。核心由放大级、反馈网络、选频网络和稳幅环节构成。主要分为三类:1)LC/RC正弦波振荡电路(如电容三点式、电感三点式),输出高频/低频正弦波;2)多谐振荡电路,通过电容充放电产生方波;3)张弛振荡电路,生成锯齿波等。设计需关注相位匹配、增益控制和元件适配。LC振荡频率由谐振参数决定,RC振荡由时间常数控制。稳幅机制通过非线性或主动元件维持等幅输出。该电路在信号发生、时钟源等领域有广泛应用。

XU157303764的博客 2036

华为机试-050-中等-HJ50.四则运算

【代码】华为机试-050-中等-HJ50.四则运算

tttzzzqqq2018的博客 253

173、NPU的编译器开发:开源社区贡献指南

本文分享了在NPU编译器开源社区贡献的经验心得。作者通过实际案例(如卷积维度错误、NaN输出等)阐述了NPU编译器开发的特殊性:硬件迭代快、边界条件复杂、厂商代码不可全信。提出有价值的贡献应聚焦硬件适配测试、性能剖析工具和反模式文档三类内容。强调用实测数据沟通、主动承担维护责任、保持代码通用性等社区协作技巧,并建议通过RFC提前沟通、附硬件实测数据等方式提高PR通过率。最后指出,NPU编译器开发是与聪明人共同填坑的过程,鼓励开发者提交"有诚意的代码"而非完美代码。

m0_50546716的博客 35

四则运算(华为机试练习)

题目描述 输入一个表达式(用字符串表示),求这个表达式的值。 保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。 代码 while True: try: s = input().replace('{', '(').replace('}', ')').replace('[', '(').replace(']', ')') res = eval(s) p

weixin_56993834的博客 356

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

机试整理(python)

华为机试整理(python)

岳来的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

华为机试真题练习汇总(共 108 题)

华为机试真题练习汇总(共 108 题)

ProgramNovice的博客 2914

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【强烈推荐收藏】坚持3个月爆肝华为机试108题C++全解(适合新手入门,就业必刷套题)

爆肝3个月为大家带来华为机试108题全解,强烈推荐学生党、就业党收藏

翟天保的博客 8万+

华为机试—四则运算(数组解决)

题目:四则运算 问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注: 3.1、表达式只含 +, -, *, / 四则运算符,不含括号 3.2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况 3.3、要考虑加减乘除按通常四则运算规定的计算优先级 3.4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为

小地盘的诺克萨斯 3785
上一篇: 中断
下一篇: 地址解析协议(ARP)
sicofield
博客等级 码龄18年 169粉丝 169原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值