题目:
输入任意一种物质,要求输出其每种元素的数量。
比如
输入 CaCO3,其组成分别为 Ca:1,C:1,O:3,输出 Ca1C1O3
输入 Fe2(SO4)3,其组成分别为 Fe:2,S:3,O:12,输出 Fe2S3O12
(注意:元素名称首字母大写,剩余字母都小写;括号括起来表示括号中的结构作
为整体出现多少次?)
这里是用java代码实现的,具体如下:
public class test01 {
public static void main(String[] args) {
//
String str = "Fe2(SO4)3";
System.out.println(countElement(str));
}
public static String countElement(String param) {
//进行字符串拼接
StringBuilder ans = new StringBuilder();
//记录元素和其对应的次数
HashMap<String, Integer> element = new HashMap<>(16);
//按顺序记录元素
List<String> lst = new ArrayList<>();
//按顺序记录每次元素在此刻出现的次数
List<Integer> lstNum = new ArrayList<>();
//存储括号开始的位置
Stack<Integer> s = new Stack<>();
for (int i = 0; i < param.length(); ++i) {
//大写英文
if (param.charAt(i) >= 'A' && param.charAt(i) <= 'Z') {
int tmp = i;
++i;
//判断++i是否为小写字母
while (i < param.length() && (param.charAt(i) <= 'z' && param.charAt(i) >= 'a')) {
++i;
}
String str = param.substring(tmp, i);
//判斷是否存在這個key
if (!element.containsKey(str)) {
element.put(str, 0);
}
lst.add(str);
//判斷i位是否為數字
if (i < param.length() && (param.charAt(i) >= '0' && param.charAt(i) <= '9')) {
int sum = 0;
while (i < param.length() && (param.charAt(i) >= '0' && param.charAt(i) <= '9')) {
sum = sum * 10 + param.charAt(i) - '0';
++i;
}
Integer value = element.get(str);
element.put(str, value + sum);
lstNum.add(sum);
} else {
Integer value = element.get(str);
element.put(str, value + 1);
lstNum.add(1);
}
--i;//回档,不然会跳过一个字符
} else if (param.charAt(i) == '(') {
//记录下括号开始的元素下标
s.push(lst.size());
} else if (param.charAt(i) == ')') {
//表示一个括号结束了可以进行计算了
++i;
int sum;
if (i < param.length() && (param.charAt(i) >= '0' && param.charAt(i) <= '9')) {
sum = 0;
while (i < param.length() && (param.charAt(i) >= '0' && param.charAt(i) <= '9')) {
sum = sum * 10 + param.charAt(i) - '0';
++i;
}
} else {
continue;
}
sum--;
for (int j = s.pop(); j < lst.size(); ++j) {
Integer value = element.get(lst.get(j));
element.put(lst.get(j), value + sum * lstNum.get(j));
Integer li = lstNum.get(j);
li = li + sum * li;
lstNum.set(j, li);
}
--i;//回档,不然会跳过一个字符
}
}
for (int i = 0; i < lst.size(); ++i) {
if (element.containsKey(lst.get(i))) {
//元素拼接一次就够了,其他地方出现的相同元素就不管它了。
Integer value = element.get(lst.get(i));
ans.append(lst.get(i) + value);
element.remove(lst.get(i));
}
}
return ans.toString();
}
}
本地调试测试通过,有需要参考的自取。记得点赞收藏加关注哦~~