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

  1. class Solution {
  2. private int i;
  3. public String countOfAtoms(String formula) {
  4. StringBuilder sb = new StringBuilder();
  5. Map<String, Integer> map = parse(formula);
  6. for(Map.Entry<String, Integer> entry: map.entrySet()) {
  7. sb.append(entry.getKey());
  8. Integer val = entry.getValue();
  9. sb.append(val == 1 ? "" : val.toString());
  10. }
  11. return sb.toString();
  12. }
  13. public Map<String, Integer> parse(String formula) {
  14. Map<String, Integer> map = new TreeMap<>();
  15. int n = formula.length();
  16. while(i < n && formula.charAt(i) != ')') {
  17. if(formula.charAt(i) == '(') {
  18. i++;
  19. Map<String, Integer> innerMap = parse(formula);
  20. for(Map.Entry<String, Integer> entry: innerMap.entrySet()) {
  21. map.put(entry.getKey(), entry.getValue() + map.getOrDefault(entry.getKey(), 0));
  22. }
  23. } else {
  24. String letter = "";
  25. int iStart = i++;
  26. while(i < n && Character.isLowerCase(formula.charAt(i))) {
  27. i++;
  28. }
  29. letter = formula.substring(iStart, i);
  30. iStart = i;
  31. while(i < n && Character.isDigit(formula.charAt(i))) {
  32. i++;
  33. }
  34. int count = i == iStart ? 1 : Integer.valueOf(formula.substring(iStart, i));
  35. if(!letter.isEmpty()) {
  36. map.put(letter, map.getOrDefault(letter, 0) + count);
  37. }
  38. }
  39. }
  40. if(i >= n) return map;
  41. int iStart = ++i;
  42. while(i < n && Character.isDigit(formula.charAt(i))) {
  43. i++;
  44. }
  45. int factor = Integer.valueOf(formula.substring(iStart, i));
  46. for(Map.Entry<String, Integer> entry: map.entrySet()) {
  47. map.put(entry.getKey(), entry.getValue() * factor);
  48. }
  49. return map;
  50. }
  51. }

Java实现 LeetCode 726 原子的数量(递归+HashMap处理)的更多相关文章

  1. Java实现 LeetCode 452 用最少数量的箭引爆气球

    452. 用最少数量的箭引爆气球 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够 ...

  2. Java实现 LeetCode 447 回旋镖的数量

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

  3. Java实现 LeetCode 753 破解保险箱(递归)

    753. 破解保险箱 有一个需要密码才能打开的保险箱.密码是 n 位数, 密码的每一位是 k 位序列 0, 1, -, k-1 中的一个 . 你可以随意输入密码,保险箱会自动记住最后 n 位输入,如果 ...

  4. Java实现 LeetCode 654 最大二叉树(递归)

    654. 最大二叉树 给定一个不含重复元素的整数数组.一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素. 左子树是通过数组中最大值左边部分构造出的最大二叉树. 右子树是通过数组中最 ...

  5. Java for LeetCode 044 Wildcard Matching

    Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...

  6. [Swift]LeetCode726. 原子的数量 | Number of Atoms

    Given a chemical formula (given as a string), return the count of each atom. An atomic element alway ...

  7. Java for LeetCode 216 Combination Sum III

    Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...

  8. Java for LeetCode 214 Shortest Palindrome

    Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. ...

  9. Java for LeetCode 212 Word Search II

    Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...

随机推荐

  1. C# 基础至集合-数组、List<T>、ArrayList、LinkedList、HashMap的一些区别

    1:数组 ]; //赋值 strs[] = "; strs[] = "; //修改 strs[] = "burg"; //删除 没法删除 除非转化为可变数组li ...

  2. Vue + Element-ui实现后台管理系统(2)---项目搭建 + ⾸⻚布局实现

    项目搭建 + ⾸⻚布局实现 上篇对该项目做了个总述 :Vue + Element-ui实现后台管理系统(1) --- 总述 这篇主要讲解 项目搭建 + 后台⾸⻚布局实现 : 整体效果 后台首页按布局一 ...

  3. 初级PLC

    SMB2接收到一个数据即产生一次中断,必须在中断处理程序中将数据从SMB2中读出,依次填表.这是一种效率极低的通讯处理方法,通讯字节多了会影响其它程序的运行. M 是位地址.比如M0.0,M0.1等. ...

  4. 学习ASP.NET Core(05)-使用Swagger与Jwt授权

    上一篇我们使用IOC容器解决了依赖问题,同时简单配置了WebApi环境,本章我们使用一下Swagger,并通过Jwt完成授权 一.Swagger的使用 1.什么是Swagger 前后端分离项目中,后端 ...

  5. vue v-for 渲染input 输入有问题 解决方案

    v-for循环input标签的时候输入信息两个输入框一同显示输入信息 解决方案: <input :placeholder="items.title" v-model = &q ...

  6. react项目中使用less并修改antd主题样式

    一.react项目中使用less 1. 安装配置 npm i -D less less-loader 2. 查看webpack配置 npm run eject 此操作不可逆,生成新的目录. 3. 修改 ...

  7. Redux:action

    引入redux之后,代码中对组件state的更新变得规范而可控,不再是分散的一句句setState,而是将组件的state集合在一个单例store中,并以引用的方式获取各自的state. 对于stat ...

  8. Java—CountDownLatch使用详解

    CountDownLatch介绍 CountDownLatch概述 CountDownLatch一般用作多线程倒计时计数器,强制它们等待其他一组(CountDownLatch的初始化决定)任务执行完成 ...

  9. 利用Python科学计算处理物理问题(和物理告个别)

    背景: 2019年初由于尚未学习量子力学相关知识,所以处于自学阶段.浅显的学习了曾谨言的量子力学一卷和格里菲斯编写的量子力学教材.注重将量子力学的一些基本概念了解并理解.同时老师向我们推荐了Quant ...

  10. select 后台获取text 并根据text 设置value选中项

    -------获取select 的text string orderNo = this.orderNo.Items[this.orderNo.SelectedIndex].Text; -----根据t ...