726. 原子的数量
作者:互联网
给你一个字符串化学式 formula ,返回 每种原子的数量 。
原子总是以一个大写字母开始,接着跟随 0 个或任意个小写字母,表示原子的名字。
如果数量大于 1,原子后会跟着数字表示原子的数量。如果数量等于 1 则不会跟数字。
例如,"H2O" 和 "H2O2" 是可行的,但 "H1O2" 这个表达是不可行的。
两个化学式连在一起可以构成新的化学式。
例如 "H2O2He3Mg4" 也是化学式。
由括号括起的化学式并佐以数字(可选择性添加)也是化学式。
例如 "(H2O2)" 和 "(H2O2)3" 是化学式。
返回所有原子的数量,格式为:第一个(按字典序)原子的名字,跟着它的数量(如果数量大于 1),然后是第二个原子的名字(按字典序),跟着它的数量(如果数量大于 1),以此类推。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-atoms
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.*;
class Solution {
int index = 0;
String formula;
private void merge(Map<String, Integer> map1, Map<String, Integer> map2) {
for (Map.Entry<String, Integer> entry : map2.entrySet()) {
map1.put(entry.getKey(), map1.getOrDefault(entry.getKey(), 0) + entry.getValue());
}
}
private Map<String, Integer> multiply(Map<String, Integer> map, int num) {
if (num == 1) {
return map;
}
Map<String, Integer> ret = new HashMap<>();
for (Map.Entry<String, Integer> entry : map.entrySet()) {
ret.put(entry.getKey(), entry.getValue() * num);
}
return ret;
}
private void addToMap(Map<String, Integer> map, String str, int num) {
map.put(str, map.getOrDefault(str, 0) + num);
}
public String countOfAtoms(String formula) {
this.index = 0;
this.formula = formula;
Stack<Map<String, Integer>> stack = new Stack<>();
stack.push(new HashMap<>());
while (index < formula.length()) {
if (formula.charAt(index) == '(') {
stack.push(new HashMap<>());
index++;
} else if (formula.charAt(index) == ')') {
index++;
int num = getNum();
Map<String, Integer> m1 = stack.pop();
Map<String, Integer> m2 = stack.peek();
m1 = multiply(m1, num);
merge(m2, m1);
} else {
addToMap(stack.peek(), getString(), getNum());
}
}
Map<String, Integer> pop = stack.pop();
TreeMap<String, Integer> treeMap = new TreeMap<>(pop);
StringBuilder ret = new StringBuilder();
for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
ret.append(entry.getKey());
if (entry.getValue() > 1) {
ret.append(entry.getValue());
}
}
return ret.toString();
}
private int getNum() {
if (index == formula.length() || !Character.isDigit(formula.charAt(index))) {
return 1;
}
int num = 0;
while (index < formula.length() && Character.isDigit(formula.charAt(index))) {
num = num * 10 + formula.charAt(index++) - '0';
}
return num;
}
private String getString() {
StringBuilder ret = new StringBuilder();
ret.append(formula.charAt(index++));
while (index < formula.length() && Character.isLowerCase(formula.charAt(index))) {
ret.append(formula.charAt(index++));
}
return ret.toString();
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
System.out.println(new Solution().countOfAtoms(in.next()));
}
}
}
标签:Map,index,ret,原子,726,num,entry,formula,数量 来源: https://www.cnblogs.com/tianyiya/p/15684373.html