输入任意一种物质,要求输出其每种元素的数量。比如输入 CaCO3,其组成分别为 Ca:1,C:1,O:3,输出 Ca1C1O3

题目:
输入任意一种物质,要求输出其每种元素的数量。
比如
输入 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();
    }

}

 本地调试测试通过,有需要参考的自取。记得点赞收藏加关注哦~~

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

棋_Rachel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值