自己开发网站怎么开发,线上宣传渠道有哪些,怎么制作一个网站及小程序,wordpress有哪些网站给定一个化学式formula#xff08;作为字符串#xff09;#xff0c;返回每种原子的数量。
原子总是以一个大写字母开始#xff0c;接着跟随0个或任意个小写字母#xff0c;表示原子的名字。
如果数量大于 1#xff0c;原子后会跟着数字表示原子的数量。如果数量等于 1…给定一个化学式formula作为字符串返回每种原子的数量。
原子总是以一个大写字母开始接着跟随0个或任意个小写字母表示原子的名字。
如果数量大于 1原子后会跟着数字表示原子的数量。如果数量等于 1 则不会跟数字。例如H2O 和 H2O2 是可行的但 H1O2 这个表达是不可行的。
两个化学式连在一起是新的化学式。例如 H2O2He3Mg4 也是化学式。
一个括号中的化学式和数字可选择性添加也是化学式。例如 (H2O2) 和 (H2O2)3 是化学式。
给定一个化学式 formula 返回所有原子的数量。格式为第一个按字典序原子的名字跟着它的数量如果数量大于 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}。
示例 4输入formula Be32
输出Be32解题思路
使用递归实现栈的功能
当遇到’(时,对括号内的元素进行递归当遇到’)时携带map出栈map内原子个数还需要乘括号后出现的数字如果没有默认为1回到上一级函数并且将返回的map进行合并在递归函数中遇到字母即需要处理原子统计个数使用treemap记录该原子出现次数
代码
class Solution {int next-1;public String countOfAtoms(String formula) {StringBuilder builder new StringBuilder();MapString, Integer map count(formula, 0);for (Map.EntryString, Integer entry : map.entrySet()) {builder.append(entry.getKey()).append(entry.getValue()1?:entry.getValue());}return builder.toString();}public MapString,Integer merge(MapString,Integer a,MapString,Integer b) {for (Map.EntryString,Integer c:b.entrySet()){a.put(c.getKey(),a.getOrDefault(c.getKey(),0)c.getValue());}return a;}public MapString,Integer count(final String formula, int l) {MapString, Integer map new TreeMapString, Integer();for (int il;iformula.length();){if(formula.charAt(i)(){MapString, Integer count count(formula, i 1);merge(map,count);inext;}else if(formula.charAt(i))){//后面没有跟数字默认值是1if(i1formula.length()||!Character.isDigit(formula.charAt(i1)))//没有跟数字nexti1;else {//把数字提取出来i;int si;while (iformula.length()Character.isDigit(formula.charAt(i)))i;int curInteger.parseInt(formula.substring(s,i));map.replaceAll((k,v)-v*cur);nexti;}return map;} else if(Character.isUpperCase(formula.charAt(i))) {
//遇到大写字母如果后面有小写的也归于此原子int s i;i;while (i formula.length() Character.isLowerCase(formula.charAt(i)))i;String key formula.substring(s, i);int cur;if (i formula.length() || !Character.isDigit(formula.charAt(i)))cur 1;else {s i;while (i formula.length() Character.isDigit(formula.charAt(i)))i;cur Integer.parseInt(formula.substring(s, i));}map.put(key, map.getOrDefault(key, 0) cur);}}return map;}
}