题目:
输入任意一种物质,要求输出其每种元素的数量。比如
输入 CaCO3,其组成分别为 Ca:1,C:1,O:3,输出 Ca1C1O3
输入 Fe2(SO4)3,其组成分别为 Fe:2,S:3,O:12,输出 Fe2S3O12
(注意:元素名称首字母大写,剩余字母都小写;括号括起来表示括号中的结构作为整体出现多少次)
解法:这里只没有嵌套括号的情况
package test;
import java.util.*;
public class kk {
static HashMap<String, Integer> map = new HashMap<>();
static String string = null;
static char[] strArr;
static List<String> list =new ArrayList<>();
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
string = scanner.nextLine();
strArr = string.toCharArray();
int len = string.length();
int index = 0;
int l = 0;
int r = 0;
while (r < len) {
int num = 1;
l = string.indexOf('(');
if (l != -1) {
r = string.indexOf(')');
if (r + 1 < len && Character.isDigit(strArr[r + 1])) {
num = Integer.valueOf(strArr[r + 1]+"",10);
}
//没括号段的
putWord(string.substring(index, l), 1);
putWord(string.substring(l+1, r), num);
if (num != 1) {
r += 2;
}
index = r;
if(r+1<=len)
string = string.substring(r+1);
} else {
putWord(string.substring(index), 1);
r = len;
}
}
for (String s : list) {
System.out.format("%s : %d, ",s, map.get(s));
}
}
public static void putWord(String str, int b) {
int l = 0;
for (int i = 1; i < str.length(); i++) {
int index = i;
while (i < str.length() && str.charAt(i) <= 'z' && str.charAt(i) >= 'a')
i++;
if (i<str.length() && Character.isDigit(str.charAt(i))) {
int num = Integer.parseInt(str.charAt(i)+"");
if(map.containsKey(str.substring(l, i))){
map.put( str.substring(l, i),map.get(str.substring(l, i))+b * num);
}else{
map.put(str.substring(l, i), b * num);
list.add(str.substring(l, i));
}
l = i;
} else {
String key = str.substring(l, i);
if(map.containsKey(key)){
map.put(key,map.get(key)+b);
}else{
map.put(key, b);
list.add(key);
}
l = i;
}
}
}
}