一、题目:原子的数量

给定一个化学式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---原子的数量【栈】相关推荐

  1. 原子的数量(容易理解)

    题目描述 给定一个化学式formula(作为字符串),返回每种原子的数量. 原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字. 如果数量大于 1,原子后会跟着数字表示原子的数量 ...

  2. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...

  3. 学习JavaScript数据结构与算法(一):栈与队列

    本系列的第一篇文章: 学习JavaScript数据结构与算法(一),栈与队列 第二篇文章:学习JavaScript数据结构与算法(二):链表 第三篇文章:学习JavaScript数据结构与算法(三): ...

  4. K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解?

    K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解? K近邻(KNN)是最简单的算法之一,它计算预测样本与训练数据集中每个数据点之间的距离,并找到 ...

  5. python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt

    数据结构与算法:Python语言描述 栈和队列 迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径 ...

  6. LeetCode-726. 原子的数量(python2)

    题目链接: 726.原子数量 题目难度:困难 题目描述: 给定一个化学式formula(作为字符串),返回每种原子的数量. 原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字. ...

  7. LeetCode 726. 原子的数量

    给定一个化学式formula(作为字符串),返回每种原子的数量. 原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字. 如果数量大于 1,原子后会跟着数字表示原子的数量.如果数量 ...

  8. 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。...

    算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...

  9. LeetCode-726 原子的数量 递归

    LeetCode-726 原子的数量 递归 题目链接:LeetCode-726 原子的数量 给你一个字符串化学式 formula ,返回 每种原子的数量 . 原子总是以一个大写字母开始,接着跟随 0 ...

  10. Python数据结构与算法(3.1)——栈

    Python数据结构与算法(3.1)--栈 0. 学习目标 1. 栈的基本概念 1.1 栈的基本概念 1.2 栈抽象数据类型 1.3 栈的应用场景 2. 栈的实现 2.1 顺序栈的实现 2.2 链栈的 ...

最新文章

  1. 享元模式 FlyWeight 结构型 设计模式(十五)
  2. STM32 电机教程 20 - 基于ST MC Workbench 无感FOC
  3. Android实例RSS客户端开发(2)--解析XML文件
  4. React(二):类组件、函数式组件
  5. 1,滑动验证,前后台接口
  6. python tornado对接权限中心的sdk封装
  7. easyui 调用dialog中的方法_SolidWorks中标准件库的创建及调用方法
  8. C++学习之路 | PTA乙级—— 1023 组个最小数 (20分)(精简)
  9. linux mysql失败_linux下登陆mysql失败
  10. sid图像数据_实战材料信息学:使用skimage处理扫描电子显微镜(SEM)图像数据
  11. 27 CO配置-控制-产品成本控制-成本对象控制-期末结算-定义评估方法(实际成本)
  12. latex 跳转标签_LaTeX技巧933: 在macOS上配置VSCode与Skim的LaTeX正反跳转
  13. 随机变量的原点矩、中心距、变异系数
  14. c语言心算抢答系统,心算抢答系统2.doc
  15. 5.8Gwifi串口服务器、485转wifi多功能串口转WIFI 、232转wifi、Modbus转RTU、工业自动化系统
  16. 在线多功能工具箱php源码
  17. java中int型的最大值_java int 的最大值 Integer.MAX_VALUE
  18. better-scroll 在vue中使用on监听事件,事件无效问题解决
  19. 深度学习(二)——从零自己制作数据集到利用deepNN实现夸张人脸表情的实时监测(tensorflow实现)
  20. 语音识别(ASR)论文优选:端到端ASR综述Recent Advances in End-to-End Automatic Speech Recognition

热门文章

  1. MongoDB 的 yum 安装
  2. 光伏行业缘何抢屋顶?
  3. 哈哈哈,看着问题一个个解决,很有满足感哦
  4. .net知识系列之五:(基本控件和数据绑定控件)
  5. Oracle数据库的静默安装详解
  6. 配置CPE作为PPPoE或PPPoA的客户端
  7. do_fork实现--下
  8. 如何理解create_singlethread_workqueue是严格按照顺序执行的
  9. Freeswitch与外域IP对接之incoming call
  10. 四级重点高频词汇表_零基础,教你裸过英语四级!这些方法请收藏