算法48---原子的数量【栈】
一、题目:原子的数量
给定一个化学式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
只包含字母、数字和圆括号,并且题目中给定的是合法的化学式。
思路:时间O(n),空间O(n)
采用一个栈,存储数字
从后往前遍历: for s in formula[::-1]
(1)遇到数字,则令 num = 数字* (10^i ),【存在连续两个数字出现,如“Be32”】故采用 i 来判断,如果前面一个字母不是数字,则 i = 0, 否则,i+=1。
即 if s.isdigit():
num += int(s)*(10**i)
i += 1
(2)遇到 ')',则将 num数字加入栈 stack 中,因为数字存在两种情况,【如‘H4(CO3)2’,像3和4是不用存到栈中,2要存进stack中】,故遇到 )才将num存进stack中。然后令num=0,i=0
即 if s == ')':
stack.append(num)
num = i = 0
(3)遇到‘(’,则将栈最后一个元素删除,因为【‘H2(CO3(CaO)4)2’】,此时stack中应该为【4,2】,遇到第一个(将2弹出,因为CO3对应的系数应为2,而CaO对应的系数为4*2=8。
即 if s == '(':
stack.pop()
num = i = 0
(4)大写字母,则将完整字母,【‘Mg'】存入字典中,其对应的系数为栈中所有数相乘的结果,如果字典中原来存在的话就将原来的系数加上,
其余条件初始化:num = i = 0,string = ’‘【小写字母】,count = 1【栈中所有的数相乘结果】
即 if s.isupper():
string += s
count = num if num else 1 #像【‘H2(CO3(CaO)4)2’】count=3,再与栈中所有数相乘
#栈中所有数相乘
for m in stack:
count *= m
# 将结果存入字典中
if string[::-1] in dic:
dic[string[::-1]] += count
else:
dic[string[::-1]] = count
#初始化
string = ''
count,num,i= 1,0,0
(5)小写字母,与之前的字母相加起来
即 if s.islower():
string += s
代码:
def countOfAtoms(self, formula):""":type formula: str:rtype: str"""if not formula:return ""stack = []dic = {}string = ''count,num,i = 1,0,0for s in formula[::-1]:if s.isdigit():num += int(s)*(10**i)i+=1elif s == ')':stack.append(num)num = 0i=0elif s == '(':stack.pop()i ,num= 0,0elif s.isupper():string += s count = num if num else 1for m in stack:count *= mif string[::-1] in dic:dic[string[::-1]] += countelse:dic[string[::-1]] = countstring = ''count,num = 1,0i = 0elif s.islower():string += ssort = sorted(dic.items(),key = lambda x:x[0])res = ''for item in sort:res += item[0]if item[1]>1:res += str(item[1])return res
转载于:https://www.cnblogs.com/Lee-yl/p/9948726.html
算法48---原子的数量【栈】相关推荐
- 原子的数量(容易理解)
题目描述 给定一个化学式formula(作为字符串),返回每种原子的数量. 原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字. 如果数量大于 1,原子后会跟着数字表示原子的数量 ...
- DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总
DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...
- 学习JavaScript数据结构与算法(一):栈与队列
本系列的第一篇文章: 学习JavaScript数据结构与算法(一),栈与队列 第二篇文章:学习JavaScript数据结构与算法(二):链表 第三篇文章:学习JavaScript数据结构与算法(三): ...
- K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解?
K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解? K近邻(KNN)是最简单的算法之一,它计算预测样本与训练数据集中每个数据点之间的距离,并找到 ...
- python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt
数据结构与算法:Python语言描述 栈和队列 迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径 ...
- LeetCode-726. 原子的数量(python2)
题目链接: 726.原子数量 题目难度:困难 题目描述: 给定一个化学式formula(作为字符串),返回每种原子的数量. 原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字. ...
- LeetCode 726. 原子的数量
给定一个化学式formula(作为字符串),返回每种原子的数量. 原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字. 如果数量大于 1,原子后会跟着数字表示原子的数量.如果数量 ...
- 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。...
算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...
- LeetCode-726 原子的数量 递归
LeetCode-726 原子的数量 递归 题目链接:LeetCode-726 原子的数量 给你一个字符串化学式 formula ,返回 每种原子的数量 . 原子总是以一个大写字母开始,接着跟随 0 ...
- Python数据结构与算法(3.1)——栈
Python数据结构与算法(3.1)--栈 0. 学习目标 1. 栈的基本概念 1.1 栈的基本概念 1.2 栈抽象数据类型 1.3 栈的应用场景 2. 栈的实现 2.1 顺序栈的实现 2.2 链栈的 ...
最新文章
- 享元模式 FlyWeight 结构型 设计模式(十五)
- STM32 电机教程 20 - 基于ST MC Workbench 无感FOC
- Android实例RSS客户端开发(2)--解析XML文件
- React(二):类组件、函数式组件
- 1,滑动验证,前后台接口
- python tornado对接权限中心的sdk封装
- easyui 调用dialog中的方法_SolidWorks中标准件库的创建及调用方法
- C++学习之路 | PTA乙级—— 1023 组个最小数 (20分)(精简)
- linux mysql失败_linux下登陆mysql失败
- sid图像数据_实战材料信息学:使用skimage处理扫描电子显微镜(SEM)图像数据
- 27 CO配置-控制-产品成本控制-成本对象控制-期末结算-定义评估方法(实际成本)
- latex 跳转标签_LaTeX技巧933: 在macOS上配置VSCode与Skim的LaTeX正反跳转
- 随机变量的原点矩、中心距、变异系数
- c语言心算抢答系统,心算抢答系统2.doc
- 5.8Gwifi串口服务器、485转wifi多功能串口转WIFI 、232转wifi、Modbus转RTU、工业自动化系统
- 在线多功能工具箱php源码
- java中int型的最大值_java int 的最大值 Integer.MAX_VALUE
- better-scroll 在vue中使用on监听事件,事件无效问题解决
- 深度学习(二)——从零自己制作数据集到利用deepNN实现夸张人脸表情的实时监测(tensorflow实现)
- 语音识别(ASR)论文优选:端到端ASR综述Recent Advances in End-to-End Automatic Speech Recognition