输入任意一种物质,要求输出其每种元素的数量

1 篇文章 0 订阅
1 篇文章 0 订阅

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

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值