当前位置:网站首页>力扣练习——33 原子的数量
力扣练习——33 原子的数量
2022-08-02 04:18:00 【qq_43403657】
33 原子的数量
1.问题描述
给定一个化学式formula(作为字符串),返回每种原子的数量。
原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字。
如果数量大于 1,原子后会跟着数字表示原子的数量。如果数量等于 1 则不会跟数字。例如,H2O 和 H2O2 是可行的,但 H1O2 这个表达是不可行的。
两个化学式连在一起是新的化学式。例如 H2O2He3Mg4 也是化学式。
一个括号中的化学式和数字(可选择性添加)也是化学式。例如 (H2O2) 和 (H2O2)3 是化学式。
给定一个化学式,输出所有原子的数量。格式为:第一个(按字典序)原子的名子,跟着它的数量(如果数量大于 1),然后是第二个原子的名字(按字典序),跟着它的数量(如果数量大于 1),以此类推。
示例 1:
输入:
formula = “H2O”
输出: “H2O”
解释:
原子的数量是 {‘H’: 2, ‘O’: 1}。
示例 2:
输入:
formula = “Mg(OH)2”
输出: “H2MgO2”
解释:
原子的数量是 {‘H’: 2, ‘Mg’: 1, ‘O’: 2}。
示例 3:
输入:
formula = “K4(ON(SO3)2)2”
输出: “K4N2O14S4”
解释:
原子的数量是 {‘K’: 4, ‘N’: 2, ‘O’: 14, ‘S’: 4}。
注意:
所有原子的第一个字母为大写,剩余字母都是小写。
formula的长度在[1, 1000]之间。
formula只包含字母、数字和圆括号,并且题目中给定的是合法的化学式。
2.输入说明
输入一个字符串,中间不包含空格
3.输出说明
输出一个字符串,表示结果。
4.范例
输入
K4(ON(SO3)2)2
输出
K4N2O14S4
5.代码
#include <iostream>
#include <queue>
#include <cstdlib>
#include <string>
#include<map>
#include<stack>
#include<algorithm>
using namespace std;
string countOfAtoms(string formula)
{
//思想:从后往前遍历
//1.定义
//记录每种原子出现的次数
map<string, int>s_map;
//有括号,就用栈,用栈记录原子需要重复的次数
stack<int>sk;
//s和d分别保存遍历到的字符和数字,均以字符串类型存储
string s = "";
string d = "";
//记录需要重复的次数
int cnt = 1;
//2.
//开始从后往前遍历
for (auto i = formula.rbegin(); i != formula.rend(); i++)//注意这里是auto类型
{
//2.1遇到数字
if (isdigit(*i))//从auto类型到int类型
d = *i + d;
//2.2遇到')'
else if (*i == ')')
{
int time = d == "" ? 1 : stoi(d);//获取d中记录的重复次数,stoi(s)将字符串转化为数字
d = "";//清空
cnt = cnt * time;//更新重复次数
sk.push(time);//入栈
}
//2.3遇到'('
else if (*i == '(')
{
cnt = cnt / sk.top();//更新重复次数
sk.pop();//出栈
}
//2.4遇到字符
else
{
s = s + *i;//更新字符串
if (*i >= 'A'&&*i <= 'Z')//遇到大写字符
{
reverse(s.begin(), s.end());//因为是从后往前遍历的,所以要反转s
s_map[s] += (d == "" ? 1 : stoi(d))*cnt;
s = ""; d = "";//清空内容
}
}
}
//3.将最终结果输出
//格式为:第一个(按字典序)原子的名子,跟着它的数量(如果数量大于 1),
//然后是第二个原子的名字(按字典序),跟着它的数量(如果数量大于 1),以此类推。
for (auto i : s_map)
{
s += i.first;//字符串连接
if (i.second > 1)//若出现次数大于1,需要加上出现次数
{
s += to_string(i.second);//将次数转为字符串
}
}
return s;
}
int main()
{
string s;
cin >> s;
string res = countOfAtoms(s);
cout << res << endl;
return 0;
}
边栏推荐
猜你喜欢
Arduino框架下STM32F1/F4系列HID模式程序烧录教程
6个月测试经验,面试跳槽狮子大开口要18K,只会点点点,给我整无语了。。
The line chart with square PyQt5_pyqtgraph mouse
从头开始实现YOLOV3
internship:数据库表和建立的实体类及对应的枚举类之间的联系示例
关于地图GIS开发事项的一次实践整理(上)
安装部署 Kubernetes 仪表板(Dashboard)
Visual SLAM Lecture Fourteen - Lecture 13 Practice: Designing a SLAM system (the most detailed code debugging and running steps)
Qt常见问题
Minecraft 1.18.1、1.18.2模组开发 23.3D动画盔甲制作
随机推荐
ScholarOne Manuscripts submits journal LaTeX file and cannot convert PDF successfully!
批量--10---根据set数拆分文件
JDBC再回顾
论文速读:Homography Loss for Monocular 3D Object Detection
Anatomy of Unreal Playback System (Part 1)
EasyCVR视频广场切换通道,视频播放协议异常的问题修复
C程序调试过程常见的错误
翻转(DAY 97)
面试官:大量请求 Redis 不存在的数据,从而打倒数据库,有什么方案?
爬虫_爬取wasde月度供需平衡表(实例)
【数字IC手撕代码】Verilog固定优先级仲裁器|题目|原理|设计|仿真
如何解决QByteArray添加quint16双字节时错误?
Camtasia 2022简体中文版屏幕录像和视频编辑软件
立方体卫星Light-1
PDF文件转换格式
已更新 联通 电信 tiny模式
OpenPCDet environment configuration of 3 d object detection and demo test
数据可视化之百变柱状图
ROS visualization of 3D target detection
我们擅长的地方很多