【360秋招笔试】编程题第二题:修改Web(C++的AC解法)

题目

先看样例:

6
16=1+2*3
7*8*9=54
1+1=1+22
4*6=22+2
15+7=1+2
11+1=1+5

n表示输入n行数据,下面每一行数据表示一个等式。如果能满足 在等式中添加任意一个数字 使得等式两边成立,则输出Yes,否则输出No。如果等式本来就相等,也输出Yes。

符号只有+,*和=。都是正整数。

想测试自己的拆分或计算是否正确,可以只使用一个样例:

1
16=1+2*3

思路

过程略微复杂的模拟题。

想要进行计算,需要将等式(字符串)拆分为数字和字符。计算过程类似于逆波兰表达式,用栈来实现。至于是否存在添加一个数字使得等式成立,我们可以枚举

本题解C++。(这种数据输入感觉用C++会方便,如果用JS需要异步??360的编程题竟然没有给输入的模板,直接ACM模式

输入字符串,得到数字和字符的函数:其中cntNum、cntCh等是指针,用来记录一共拆分出了多少数。

void stringTo(string a){int temp=0;for(int i=0;a[i];i++){if(a[i]>='0'&&a[i]<='9'){temp*=10;temp+=a[i]-'0';}else{ch[cntCh]=a[i];cntCh++;num[cntNum]=temp;cntNum++;temp=0;}}num[cntNum]=temp;cntNum++;temp=0;
}

对等号=左右两边的数字进行计算,思想是逆波兰表达式

这里的参数left、right表示计算数组中[left,right]的答案。这样,只需要改变参数就可以分别计算等号左边和等号右边。

注意,数字的数量会比符号多1,因此可以先把第一个数字压入栈。

//计算左右两边的大小 
//左 1,indexx
//右 indexx+1,end 
int cal(int left,int right){if(left==right) return num[left];stack<int>numm;stack<char>chh;numm.push(num[left]);
//	数字 for(int i=left+1;i<=right;i++){//对应的操作符是i-1的下标 char op=ch[i-1];//优先级高 if(op=='*'){int qian=numm.top();numm.pop();int hou=num[i];int temp=qian*hou;numm.push(temp);}else{numm.push(num[i]);chh.push(ch[i-1]);}}//	计算加减while(chh.size()){char op=chh.top();chh.pop();int hou=numm.top();numm.pop();int qian=numm.top();numm.pop();int temp=qian+hou;numm.push(temp);} return numm.top();
}

枚举在字符串中每一个位置都插入一个数字并计算:

for(int i=0;a[i];i++){c.clear();b+=a[i];c+=b;for(int j=0;j<=9;j++){c+=char('0'+j);c+=a.substr(i+1);if(solve(c)) {flag=1;break;}c.clear();c+=b;}if(flag) break;
}

总体的过程:将字符串转换为数字和符号、计算。这个过程可以封装一下:

bool solve(string a){clearr();stringTo(a);findEqual();l=cal(0,indexx);r=cal(indexx+1,cntNum-1);if(l==r) return true;else return false;
}

总体代码(AC)

#include<bits/stdc++.h>
using namespace std;
int t;string a;
int num[5000];
char ch[5000];
int cntNum=0,cntCh=0;
int indexx;//=的下标 
int l,r;
void clearr(){cntNum=0,cntCh=0;
}
void stringTo(string a){int temp=0;for(int i=0;a[i];i++){if(a[i]>='0'&&a[i]<='9'){temp*=10;temp+=a[i]-'0';}else{ch[cntCh]=a[i];cntCh++;num[cntNum]=temp;cntNum++;temp=0;}}num[cntNum]=temp;cntNum++;temp=0;
}
//找到=的下标index 对应num的下标,index及其之前的都是=号左边的 
void findEqual(){for(int i=0;i<cntCh;i++){if(ch[i]=='='){indexx=i;break;}} 
}
//计算左右两边的大小 
//左 1,indexx
//右 indexx+1,end 
int cal(int left,int right){if(left==right) return num[left];stack<int>numm;stack<char>chh;numm.push(num[left]);
//	数字 for(int i=left+1;i<=right;i++){//对应的操作符是i-1的下标 char op=ch[i-1];//优先级高 if(op=='*'){int qian=numm.top();numm.pop();int hou=num[i];int temp=qian*hou;numm.push(temp);}else{numm.push(num[i]);chh.push(ch[i-1]);}}//	计算加减while(chh.size()){char op=chh.top();chh.pop();int hou=numm.top();numm.pop();int qian=numm.top();numm.pop();int temp=qian+hou;numm.push(temp);} return numm.top();
}bool solve(string a){clearr();stringTo(a);findEqual();l=cal(0,indexx);r=cal(indexx+1,cntNum-1);if(l==r) return true;else return false;
}int main(){cin>>t;while(t--){clearr();l=0,r=0;cin>>a;stringTo(a);//        找= indexfindEqual();l=cal(0,indexx);r=cal(indexx+1,cntNum-1);if(l==r) {cout<<"Yes"<<endl;continue;}string b,c;int flag=0;//在最前面加for(int i=0;i<=9;i++){c.clear();c+=char('0'+i);c+=a;if(solve(c)) {flag=1;break;}}if(flag) {cout<<"Yes"<<endl;continue;}b.clear();c.clear();for(int i=0;a[i];i++){c.clear();b+=a[i];c+=b;for(int j=0;j<=9;j++){c+=char('0'+j);c+=a.substr(i+1);if(solve(c)) {flag=1;break;}c.clear();c+=b;}if(flag) break;}if(flag) {cout<<"Yes"<<endl;continue;}else cout<<"No"<<endl;    }return 0;
}

不重要心得

很典型且要素很多的模拟题,字符串的计算+逆波兰表达式+枚举。写了70多分钟!
输入的数据范围并不大,所以枚举可以实现。不知道有没有更好的写法。
代码写的乱乱的,也不精简,等有空的时候重新写一下。

另外:我是前端啊!但是看到编程题没有给异步输入数据的模板的时候傻眼了。。这咋做。。被迫捡起用C++打题的记忆了,不然就寄了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大厂面试-16道面试题

1 java集合类有哪些&#xff1f; List是有序的Collection&#xff0c;使用此接口能够精确的控制每个元素的插入位置&#xff0c;用户能根据索引访问List中元素。常用的实现List的类有LinkedList&#xff0c;ArrayList&#xff0c;Vector&#xff0c;Stack。 ArrayList是容量…

每日一题 198打家劫舍(动态规划)

题目 198题目 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…

某度sign参数逆向

文章目录 前文分析完整代码结尾 前文 本文章中所有内容仅供学习交流&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 分析 经过我们几次抓包&#xff0c;测试&#xf…

解决jupyter打开的默认路径问题

已经安装完anaconda&#xff0c;但是jupyter每一次打开的路径都不是自己想要的路径&#xff0c;可以在配置文件中修改jupyter打开的默认路径&#xff0c;具体步骤如下&#xff1a; 首先打开anaconda的命令行 如果有多个环境的&#xff0c;需要输入conda activate 环境名称以下命…

list容器排序案例

案例描述:将Perspn自定义数据类型进行排序&#xff0c;Person中属性有姓名、年龄、身高 排序规则:按照年龄进行升序&#xff0c;如果年龄相同按照身高进行降序 代码示例 #include <iostream> #include <string.h> #include <iterator> #include <vector…

资讯| 工信部拟筹建元宇宙标准化工作组;《权游》作者起诉OpenAI

元宇宙赛道 工信部&#xff1a;优先开展“元宇宙 工业制造”等行业应用标准研制 9月18日&#xff0c;工业和信息化部科技司就《工业和信息化部元宇宙标准化工作组筹建方案&#xff08;征求意见稿&#xff09;》&#xff08;以下简称《方案》&#xff09;公开征求意见。 工业…

小程序搜索词优化:小陈运营的秘密武器

大家好&#xff0c;我是小陈&#xff0c;今天要和大家分享一下小程序搜索词优化的经验和技巧。在数字化时代&#xff0c;小程序已经成为许多企业的重要工具&#xff0c;但要让小程序在竞争激烈的市场中脱颖而出&#xff0c;搜索词优化是不可或缺的一环。在本文中&#xff0c;我…

【C++面向对象侯捷】12.虚函数与多态 | 13.委托相关设计【设计模式 经典做法,类与类之间关联起来,太妙了,不断的想,不断的写代码】

文章目录 12.虚函数与多态举例&#xff1a;委托 继承【观察者模式】13.委托相关设计Composite 组合模式Prototype 原型模式 12.虚函数与多态 纯虚函数 一定要 子类重新定义的 继承和复合 关系下的构造和析构 举例&#xff1a;委托 继承【观察者模式】 13.委托相关设计 问题…

云原生安全性:保护现代应用免受威胁

文章目录 引言云原生安全性的挑战云原生安全性的关键实践1. 安全的镜像构建2. 网络策略3. 漏洞扫描和漏洞管理4. 认证和授权5. 日志和监控 云原生安全工具结论 &#x1f389;欢迎来到云计算技术应用专栏~云原生安全性&#xff1a;保护现代应用免受威胁 ☆* o(≧▽≦)o *☆嗨~我…

详解Python的__new__()方法

__new__与__init__的区别 new() 方法主要存在于Python2的新式类和Python3中。它是负责创建类实例的静态方法。 当Python实例化一个对象时&#xff0c;首先调用__new__()方法构造一个类的实例&#xff0c;并为其分配对应类型的内存空间&#xff0c;该实例的内存地址就是它的唯一…

科目二倒车入库

调整座位和后视镜 离合踩到底大腿小腿成130-140 上半身90-100 座椅高度能看到前方全部情况 后视镜调节到能看到后门把手&#xff0c;且后门把手刚好在后视镜上方边缘、离车1/3处。 保持直线&#xff1a; 前进&#xff1a; 车仪表盘中央的原点和地面上的黄线擦边&#xff…

Docker CMD指令如何覆写

在Dockerfile里,CMD指令是可以被覆盖的。 在构建镜像时,可以通过docker build命令的–cmd选项覆盖Dockerfile的CMD: 例如: FROM ubuntu CMD ["echo","hello"]构建时覆盖CMD: docker build -t test --cmd "echo world" .在创建容器时,可以通过…

【AI视野·今日NLP 自然语言处理论文速览 第三十八期】Thu, 21 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 21 Sep 2023 Totally 57 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Chain-of-Verification Reduces Hallucination in Large Language Models Authors Shehzaad Dhuliawala, Mojt…

PyTorch深度学习实战(17)——多任务学习

PyTorch深度学习实战&#xff08;17&#xff09;——多任务学习 0. 前言1. 多任务学习1.1 多任务学习基本概念1.2 多任务学习优势 2. 模型与数据集分析2.1 模型分析2.2 数据集介绍 3. 实现年龄估计和性别分类小结系列链接 0. 前言 多任务学习( Multi-Task Learning, MTL )是一…

双向控制舵机(树莓派版)

文章目录 前言1、舵机参数2、功能测试参考文献 前言 为了实现垃圾分类和倾倒功能&#xff0c;于是购买了180度舵机 避坑提示&#xff1a;360度舵机无法像180度舵机一样控制角度&#xff0c;它只能控制旋转方向和速度&#xff0c;所以别买360度的舵机。 1、舵机参数 我买的舵机…

ajax上传文件

背景 采用ajax传递表单内容和上传的文件 实现原理 使用FormData模拟表单数据&#xff0c;实现异步上传图片 代码 var formData new FormData(); formData.append("serviceId", param.serviceId); formData.append("keyId", param.keyId); formData.a…

194、SpringBoot -- 下载和安装 Erlang 、 RabbitMQ

本节要点&#xff1a; 一些命令&#xff1a; 小黑窗输入&#xff1a; rabbitmq-plugins enable rabbitmq_management 启动控制台插件 rabbitmq-server 启动rabbitMQ服务器 管理员启动小黑窗&#xff1a; rabbitmq-service install 添加rabbitMQ为本地服务 启动浏览器访问“h…

ffmpeg ffplay

gif -> jpg: ffmpeg -i 4.gif -r 25 -q:v 4 -pix_fmt yuv420p jpg2/frame%03d.jpg -y # ffplay ffplay [选项] [输入文件] option -x width 强制以 "width" 宽度显示 -y height 强制以 "height" 高度显示 -an 禁止音频 …

gym_unity学习笔记

最近学了一段时间gym_unity&#xff0c;把一些资料留在这里 实例 实例gym_unity训练RollerBall&#xff1a;https://blog.csdn.net/alibutter/article/details/120908687实例gyn_unity训练3DBall&#xff1a;https://zhuanlan.zhihu.com/p/554927641?utm_id0 源码&#xff1…

大二毕设.3-网盘系统-用户模块讲解

目录 模块功能介绍 具体实现讲解 constants层&#xff1a;存放用户模块常量类 entity层&#xff1a;存放实体类&#xff0c;与数据库中的属性值基本保持一致 mapper层&#xff1a;对数据库进行数据持久化操作 service层&#xff1a;业务逻辑层&#xff0c;主要是针对具体…