码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【递归算法】输入任意一种物质的化学分子式,要求输出其每种元素的数量.


    在百度上看到一个问题,题目是:

    1. 编程题

    输入任意一种物质,要求输出其每种元素的数量.
    比如
    输入CaC03 ,其组成分别为Ca : 1, C : 1,0 : 3 ,输出CalC103
    输入 Fe2(SO4)3 ,其组成分别为 Fe : 2 , S : 3,0 : 12 ,输出 Fe2S3O12
    (注意:元素名称首字母大写,剩余字母都〃与;括号括起来表示括号中的结构作 为整体出现多少次)

    参考链接:
    输入任意一种物质,要求输出其每种元素的数量

    2. 思路其实还是分治, 逐层迭代渐降

    package org.example;
    
    import java.util.*;
    
    public class BaiduTest {
        static Map<String, Integer> map = new HashMap<>();
    
        public static void main(String[] args) {
            String demo = "C3((CO)2)4";
            System.out.println(demo);
            splitString(demo, 1);
            System.out.println(map);
        }
    
        private static void splitString(String demo, int rdx) {
            List<String> list = new ArrayList<>();
            int idx = 0;
            for (int i = 0; i < demo.length(); i++) {
                char c = demo.charAt(i);
                if (Character.isUpperCase(c) && i != idx || c == '(') {
                    String keyVal = demo.substring(idx, i);
                    list.add(keyVal);
                    idx = i;
                    if (c == '(') {
                        i = demo.lastIndexOf(')');
                    }
                }
            }
            if (idx < demo.length()) {
                list.add(demo.substring(idx));
            }
            for (String val : list) {
                if (val.contains("(")) {
                    int composeVal = getComposeVal(val);
                    splitString(val.substring(1, val.lastIndexOf(')')), composeVal * rdx);
                } else {
                    putMap(val, rdx);
                }
            }
        }
    
        // (S3(CA)O4)300
        private static int getComposeVal(String val) {
            int rdx = 1;
            int idx = val.lastIndexOf(')');
            if (++idx < val.length())
                rdx = Integer.valueOf(val.substring(idx));
            return rdx;
        }
    
        private static void putMap(String keyVal, int rdx) {
            String key;
            int val = 1;
            int k = 0;
            for (int i = 0; i < keyVal.length(); i++) {
                if (Character.isDigit(keyVal.charAt(i))) {
                    k = i;
                    break;
                }
            }
            if (k != 0) {
                key = keyVal.substring(0, k);
                val = Integer.valueOf(keyVal.substring(k));
            } else {
                key = keyVal;
            }
            if (!key.isEmpty()) {
                Integer result = map.get(key);
                if (result == null)
                    result = 0;
                map.put(key, val * rdx + result);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    3. 算法解析:

    3.1 存取元素得出现次数

    用 map 保存, 实现很方便

    3.2 分隔字符串

    用大写字符以及 ‘(’ 表示一个完整字符串的结束,
    分隔完的字符串的形式:
    为"Key" ,“KeyVal”,“(KeyVal)Val”,“((KeyVal)Val)Val” 等

    3.3

    没有Val 表示有1次
    如果有() 嵌套, val 记得相乘

    4. 运行结果:

    缺少语法分析,判断是否合法,比如 括号是否对称之类

    C3((CO)2)4
    {C=11, O=8}
    
    • 1
    • 2
  • 相关阅读:
    利用可视化结果,点击出现对应的句子
    防御塔攻击小兵,C++观察者模式
    机器人强化学习——第一人称 VS 第三人称
    详解StringBuilder和StringBuffer(区别,使用方法,含源码讲解)
    Android系统的Ashmem匿名共享内存子系统分析(2)- 运行时库cutils的Ashmem访问接口
    ERP系统和MES系统,选哪个?文末有答案
    【图像增强】基于DEHAZENET和HWD的水下去散射图像增强附matlab代码
    几个常见的C/C++语言冷知识
    月报总结|Moonbeam 7月份大事一览
    安徽某高校《数学建模》上机习题1选讲(建立范德蒙矩阵;解线性方程组)
  • 原文地址:https://blog.csdn.net/hitzsf/article/details/126060494
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号