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

class Solution {
private int i;
public String countOfAtoms(String formula) {
StringBuilder sb = new StringBuilder();
Map<String, Integer> map = parse(formula);
for(Map.Entry<String, Integer> entry: map.entrySet()) {
sb.append(entry.getKey());
Integer val = entry.getValue();
sb.append(val == 1 ? "" : val.toString());
} return sb.toString();
} public Map<String, Integer> parse(String formula) {
Map<String, Integer> map = new TreeMap<>();
int n = formula.length();
while(i < n && formula.charAt(i) != ')') {
if(formula.charAt(i) == '(') {
i++;
Map<String, Integer> innerMap = parse(formula);
for(Map.Entry<String, Integer> entry: innerMap.entrySet()) {
map.put(entry.getKey(), entry.getValue() + map.getOrDefault(entry.getKey(), 0));
}
} else {
String letter = "";
int iStart = i++;
while(i < n && Character.isLowerCase(formula.charAt(i))) {
i++;
}
letter = formula.substring(iStart, i); iStart = i;
while(i < n && Character.isDigit(formula.charAt(i))) {
i++;
} int count = i == iStart ? 1 : Integer.valueOf(formula.substring(iStart, i)); if(!letter.isEmpty()) {
map.put(letter, map.getOrDefault(letter, 0) + count);
}
}
} if(i >= n) return map; int iStart = ++i;
while(i < n && Character.isDigit(formula.charAt(i))) {
i++;
}
int factor = Integer.valueOf(formula.substring(iStart, i));
for(Map.Entry<String, Integer> entry: map.entrySet()) {
map.put(entry.getKey(), entry.getValue() * factor);
} return map;
} }

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. Coursera课程笔记----计算导论与C语言基础----Week 10

    C程序中的数组(Week 10) 一维数组 数组的定义 类型 数组名[常量表达式] int sheep[10] 定义数组时,[]内必须为常量表达式 可以用const int 可以在main函数前,#d ...

  2. python 基础应用5-简单购物车

    1.列表去重 #列表去重 li = [1,2,33,33,2,1,4,5,6,6] set1 = set(li)# 转为集合 li = list(set1)# 转为列表 print(li)#[1, 2 ...

  3. 不同版本(2.3/2.4/2.5/3.0/3.1)web.xml头信息

    Web App 3.1 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http:// ...

  4. 分布式项目配置工程,在项目间互通要先在linux下开启zookeeper

    一.编写配置文件 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http: ...

  5. Sentinel源码解析三(滑动窗口流量统计)

    前言 Sentinel的核心功能之一是流量统计,例如我们常用的指标QPS,当前线程数等.上一篇文章中我们已经大致提到了提供数据统计功能的Slot(StatisticSlot),StatisticSlo ...

  6. Enjoy the pain about Moloch

    这echo出来的啥子嘛?意思是小姐姐有自虐倾向?可若是moloch有汉化包或翻译文件,小姐姐至于这么“享受”install的过程吗? 过程都走过了,那就记录一下吧:1.找个Ubuntu镜像,阿里云镜像 ...

  7. 201771010128王玉兰《面向对象与程序设计(java)第十五周学习总结》

    第一部分:理论知识 一:JAR文件 Java程序的打包:程序编译完成后,程序员 将.class文件压缩打包为.jar文件后,GUI界面 程序就可以直接双击图标运行. jar文件(Java归档)既可以包 ...

  8. Nginx301重定向

    1)301重定向,把blog.moonsbird.com和moonsbirl.com合并,并把之前的域名也一并合并. 有两种实现方法,第一种方法是判断nginx核心变量host(老版本是http_ho ...

  9. js操作html的基本方法

    刚学了js操作html的基本方法,在写代码过程中,有很多格式不规范,忘记加双引号尤其重要,通常这 样的错误很容易范,并且这种错误很难找.随着代码学习量越来越多,很多写法容易搞混.今天记录一下,以便后期 ...

  10. Vue 百度地图显示规划路线

    Vue 百度地图显示规划路线 1.首选引入相应的文件(建议单页面引入)(如有问题找上一篇博客园) 2.区别就是需要多引入几根不同的文件 import { BaiduMap, BmScale, BmGe ...