题目链接:

726.原子数量

题目难度:困难

题目描述:

给定一个化学式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只包含字母、数字和圆括号,并且题目中给定的是合法的化学式。

解题思路与解题代码:

# -*- coding: UTF-8 -*-
class Solution(object):def countOfAtoms(self, formula):stack = list()# 第一步将每个元素、数字、括号独立出来,也就是说有的元素有两个字母组成,有的数字是10以上的# 因此要把他们组合i = 0n = len(formula)while i < n:if formula[i].isalpha():if formula[i].islower():c = stack.pop()c = c + formula[i]stack.append(c)else:stack.append(formula[i])i += 1elif formula[i] == '(':stack.append(formula[i])i += 1elif formula[i] == ')':stack.append(formula[i])i += 1else:num_str = formula[i]i += 1while i < n and formula[i].isdigit():num_str += formula[i]i += 1stack.append(num_str)# 组合结果如下# print stack# ['K', '4', '(', 'O', 'N', '(', 'S', 'O', '3', ')', '2', ')', '2']# 第二步 有的元素只有一个,因此要把1补齐i = 0m = len(stack)-1tmp_stack = list()for i in range(m):tmp_stack.append(stack[i])if stack[i].isalpha():if not stack[i+1].isdigit():tmp_stack.append("1")tmp_stack.append(stack[m])if stack[m].isalpha():tmp_stack.append("1")stack = tmp_stack# 补齐结果如下# print stack# ['K', '4', '(', 'O', '1', 'N', '1', '(', 'S', '1', 'O', '3', ')', '2', ')', '2']# 第三步,开始遍历,进行计算,每次遇到一个“)”都往回找“(”,把括号外的数字乘进去,并组合元素和数字stack2 = list()i = 0l = len(stack)while i < l:if stack[i].isalpha():stack2.append([stack[i],stack[i+1]])i += 2elif stack[i] == '(':stack2.append(stack[i])i += 1elif stack[i] == ')':num = int(stack[i+1])tmp = list()c = stack2.pop()while i > 0 and c != '(':c1 = [c[0], str(int(c[1]) * num)]tmp.append(c1)c = stack2.pop()stack2.extend(tmp)i += 2# print stack2# [['K', '4'], ['S', '4'], ['O', '12'], ['N', '2'], ['O', '2']]# 第四步,计算基本完成,将结果中重复元素合并,result_dict = {}for i in stack2:if result_dict.has_key(i[0]):count = result_dict[i[0]] + int(i[1])result_dict[i[0]] = countelse:result_dict[i[0]] = int(i[1])result = ""sor = sorted(result_dict)for key in sor:if result_dict[key] == 1:result += keyelse:result += str(key)+str(result_dict[key])print result# K4N2O14S4return result# a = Solution()
# a.countOfAtoms("K4(ON(SO3)2)2")

 时间复杂度: O(n)

LeetCode-726. 原子的数量(python2)相关推荐

  1. LeetCode 726. 原子的数量

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

  2. 726. 原子的数量

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

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

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

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

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

  5. LeetCode 452. 用最少数量的箭打破气球(贪心)

    1. 题目 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标. 由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了. 开始坐标总是小 ...

  6. LeetCode 447. 回旋镖的数量(哈希map+组合数)

    1. 题目 给定平面上 n 对不同的点,"回旋镖" 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序). 找到 ...

  7. LeetCode 1020. 飞地的数量(图的BFS/DFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 给出一个二维数组 A,每个单元格为 0(代表海)或 1(代表陆地). 移动是指在陆地上从一个地方走到另一个地方(朝四个方向 ...

  8. [LeetCode] 447.回旋镖的数量(Easy)C语言题解

    题目 给定平面上 n 对不同的点,"回旋镖" 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序). 找到所有回 ...

  9. leetcode 452. 用最少数量的箭引爆气球(贪心算法)

    在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了.开始坐标总是小于结束坐标. 一 ...

最新文章

  1. flask token 登录验证
  2. 非标自动化企业前十名_非标自动化设计:非标自动化是如何被称做企业里的血液?...
  3. 详解:XenServer丢失存储库SR解决方法
  4. ubuntu查看python版本-linux查看python安装路径,版本号
  5. HDU 4391 Paint The Wall 段树(水
  6. mysql数据库用hs_MySQL数据库安装步骤
  7. SDNU 1416.一元三次方程求解(数学)
  8. 8086汇编语言显示一串字符串中ASCII码最大的一个字符
  9. 创建苹果id失败_自制无添加苹果干 无糖
  10. clock()、time()、clock_gettime()和gettimeofday()函数的用法和区别
  11. 【leetcode】 Unique Binary Search Trees (middle)☆
  12. swift开发网络篇—NSURLConnection基本使用
  13. Android 11 开机动画资源
  14. 简易论坛代码源码(php+css+js+mysql)完整的代码源码,系统使用B/S架构
  15. 行人重识别论文阅读6-低分辨率的行人重识别研究
  16. 【洛谷】P1725 琪露诺
  17. java watcher service_GitHub - sinix/watcher: watcher(守望者)提供java应用暴露监控/健康检查的能力。...
  18. java文件上传后台
  19. java空瓶换饮料的程序实现
  20. excel转tsv格式

热门文章

  1. python 多进程multiprocessing 队列queue报错:AttributeError: Can't pickle local object
  2. python 如何将字符串列表合并后转换成字符串? ''.join(List(str))函数
  3. python 正则表达式 re.findall()方法
  4. @order注解_Spring Boot+OAuth2,一个注解搞定单点登录!
  5. mysql触发器对同一张表做操作_MySql 触发器对同表操作
  6. mysql between and 包含边界吗_MySQL | SQL语法(一)
  7. 1、LeetCode784 字母大小写全排列
  8. 带负荷测试要求二次最小电流_检修状态下二次带负荷测试方案的优化研究
  9. 八叉树 java_java简单实现八叉树图像处理代码示例
  10. activiti如何最后一次提交事务_MySQL如何找出未提交事务的SQL浅析