ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

726. 原子的数量

2021-12-13 17:35:15  阅读:187  来源: 互联网

标签:Map index ret 原子 726 num entry formula 数量


给你一个字符串化学式 formula ,返回 每种原子的数量 。

原子总是以一个大写字母开始,接着跟随 0 个或任意个小写字母,表示原子的名字。

如果数量大于 1,原子后会跟着数字表示原子的数量。如果数量等于 1 则不会跟数字。

例如,"H2O" 和 "H2O2" 是可行的,但 "H1O2" 这个表达是不可行的。
两个化学式连在一起可以构成新的化学式。

例如 "H2O2He3Mg4" 也是化学式。
由括号括起的化学式并佐以数字(可选择性添加)也是化学式。

例如 "(H2O2)" 和 "(H2O2)3" 是化学式。
返回所有原子的数量,格式为:第一个(按字典序)原子的名字,跟着它的数量(如果数量大于 1),然后是第二个原子的名字(按字典序),跟着它的数量(如果数量大于 1),以此类推。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-atoms
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.*;

class Solution {
    int index = 0;
    String formula;

    private void merge(Map<String, Integer> map1, Map<String, Integer> map2) {
        for (Map.Entry<String, Integer> entry : map2.entrySet()) {
            map1.put(entry.getKey(), map1.getOrDefault(entry.getKey(), 0) + entry.getValue());
        }
    }

    private Map<String, Integer> multiply(Map<String, Integer> map, int num) {
        if (num == 1) {
            return map;
        }
        Map<String, Integer> ret = new HashMap<>();
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            ret.put(entry.getKey(), entry.getValue() * num);
        }

        return ret;
    }

    private void addToMap(Map<String, Integer> map, String str, int num) {
        map.put(str, map.getOrDefault(str, 0) + num);
    }

    public String countOfAtoms(String formula) {
        this.index = 0;
        this.formula = formula;

        Stack<Map<String, Integer>> stack = new Stack<>();
        stack.push(new HashMap<>());

        while (index < formula.length()) {
            if (formula.charAt(index) == '(') {
                stack.push(new HashMap<>());
                index++;
            } else if (formula.charAt(index) == ')') {
                index++;
                int num = getNum();
                Map<String, Integer> m1 = stack.pop();
                Map<String, Integer> m2 = stack.peek();
                m1 = multiply(m1, num);
                merge(m2, m1);
            } else {
                addToMap(stack.peek(), getString(), getNum());
            }
        }

        Map<String, Integer> pop = stack.pop();
        TreeMap<String, Integer> treeMap = new TreeMap<>(pop);
        StringBuilder ret = new StringBuilder();

        for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
            ret.append(entry.getKey());
            if (entry.getValue() > 1) {
                ret.append(entry.getValue());
            }
        }

        return ret.toString();

    }

    private int getNum() {
        if (index == formula.length() || !Character.isDigit(formula.charAt(index))) {
            return 1;
        }
        int num = 0;
        while (index < formula.length() && Character.isDigit(formula.charAt(index))) {
            num = num * 10 + formula.charAt(index++) - '0';
        }
        return num;
    }

    private String getString() {
        StringBuilder ret = new StringBuilder();
        ret.append(formula.charAt(index++));
        while (index < formula.length() && Character.isLowerCase(formula.charAt(index))) {
            ret.append(formula.charAt(index++));
        }
        return ret.toString();
    }


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            System.out.println(new Solution().countOfAtoms(in.next()));
        }
    }

}

标签:Map,index,ret,原子,726,num,entry,formula,数量
来源: https://www.cnblogs.com/tianyiya/p/15684373.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有