在百度上看到一个问题,题目是:
输入任意一种物质,要求输出其每种元素的数量.
比如
输入CaC03 ,其组成分别为Ca : 1, C : 1,0 : 3 ,输出CalC103
输入 Fe2(SO4)3 ,其组成分别为 Fe : 2 , S : 3,0 : 12 ,输出 Fe2S3O12
(注意:元素名称首字母大写,剩余字母都〃与;括号括起来表示括号中的结构作 为整体出现多少次)
参考链接:
输入任意一种物质,要求输出其每种元素的数量
package org.example;
import java.util.*;
public class BaiduTest {
static Map<String, Integer> map = new HashMap<>();
public static void main(String[] args) {
String demo = "C3((CO)2)4";
System.out.println(demo);
splitString(demo, 1);
System.out.println(map);
}
private static void splitString(String demo, int rdx) {
List<String> list = new ArrayList<>();
int idx = 0;
for (int i = 0; i < demo.length(); i++) {
char c = demo.charAt(i);
if (Character.isUpperCase(c) && i != idx || c == '(') {
String keyVal = demo.substring(idx, i);
list.add(keyVal);
idx = i;
if (c == '(') {
i = demo.lastIndexOf(')');
}
}
}
if (idx < demo.length()) {
list.add(demo.substring(idx));
}
for (String val : list) {
if (val.contains("(")) {
int composeVal = getComposeVal(val);
splitString(val.substring(1, val.lastIndexOf(')')), composeVal * rdx);
} else {
putMap(val, rdx);
}
}
}
// (S3(CA)O4)300
private static int getComposeVal(String val) {
int rdx = 1;
int idx = val.lastIndexOf(')');
if (++idx < val.length())
rdx = Integer.valueOf(val.substring(idx));
return rdx;
}
private static void putMap(String keyVal, int rdx) {
String key;
int val = 1;
int k = 0;
for (int i = 0; i < keyVal.length(); i++) {
if (Character.isDigit(keyVal.charAt(i))) {
k = i;
break;
}
}
if (k != 0) {
key = keyVal.substring(0, k);
val = Integer.valueOf(keyVal.substring(k));
} else {
key = keyVal;
}
if (!key.isEmpty()) {
Integer result = map.get(key);
if (result == null)
result = 0;
map.put(key, val * rdx + result);
}
}
}
用 map
用大写字符以及 ‘(’ 表示一个完整字符串的结束,
分隔完的字符串的形式:
为"Key" ,“KeyVal”,“(KeyVal)Val”,“((KeyVal)Val)Val” 等
没有Val 表示有1次
如果有() 嵌套, val 记得相乘
缺少语法分析,判断是否合法,比如 括号是否对称之类
C3((CO)2)4
{C=11, O=8}