题目

对于由字符串表示的给定化学式,计算分子中包含的每个元素的原子数并返回一个对象:Java 中的 Map<String,Integer>。

例如:

var water = 'H2O';
parseMolecule(water); // return {H: 2, O: 1}var magnesiumHydroxide = 'Mg(OH)2';
parseMolecule(magnesiumHydroxide); // return {Mg: 1, O: 2, H: 2}var fremySalt = 'K4[ON(SO3)2]2';
parseMolecule(fremySalt); // return {K: 4, O: 14, N: 2, S: 4}

如您所见,某些公式中包含括号。括号外的索引告诉您,您必须在该索引上乘以括号内每个原子的计数。例如,在 Fe(NO3)2 中有一个铁原子、两个氮原子和六个氧原子。

请注意,括号可以是圆形、方形或卷曲的,也可以是嵌套的。大括号后的索引是可选的。

本题我解得非常复杂,在我提交之后看到有更好的答案, 这里分享一下我认为不错的答案。

解题思路

  • 逆向for循环公式

    • 这样的话,只需要用大写字母做结束符
  • 使用list作为栈来解决括号带来的叠加问题
  • 使用正则来判断是否合法

解题代码:

fun getAtomsRepeat(formula: String):Map<String, Int>{val counter = mutableMapOf<String, Int>()var atom = ""var digit = ""val numbers = mutableListOf(1)if ("\\{\\w*[\\]\\)]|\\(\\w*[\\]\\}]|\\[\\w*[\\}\\)]".toRegex().containsMatchIn(formula) ||formula.replace("\\w".toRegex(), "").length % 2 != 0) throw IllegalArgumentException()for(char in formula.reversed()){when{char in listOf(')', ']', '}') -> {numbers.add(digit.toIntOrNull()?:1)digit = ""}char in listOf('(','[', '{') -> numbers.removeAt(numbers.lastIndex)char.isDigit() -> digit = "$char$digit"char.isLowerCase() -> atom = "$char$atom"char.isUpperCase() ->{atom = "$char$atom"val number = numbers.reduce(Int::times) * (digit.toIntOrNull()?:1)counter[atom] = counter[atom]?.let { it+number }?:numberdigit = ""atom = ""}}println("当前char:$char atom:$atom numbers:$numbers digit:$digit counter:${counter}")}return counter
}fun main() {println(getAtomsRepeat("As2{Be4C5[BCo3(CO2)3]2}4Cu15"))
//    println(getAtomsRepeat(")5"))
}

kotlin完成 Code War 题目 解析分子公式相关推荐

  1. 电子学会青少年编程等级考试Python一级题目解析12

    Python一级题目解析 1.题目(2021.03) 写一个计算长方形面积的程序,并对每行代码进行相应的注释,要求如下: (1)采用多行注释,说明程序的功能(如下): "计算长方形的面积 并 ...

  2. Mysql窗口函数 (知识点梳理+题目解析+面试实战)(四万字长文,一文读懂,建议收藏后食用)

    前言: 本文章是原创50篇时开启的纪念作,之前的文章基本5000字,而本篇约4.5万字,真一篇顶九篇. 窗口函数作为Mysql 8的新特性以及面试笔试的重点,掌握并且进行来练习是非常有必要的.本文章详 ...

  3. PTA 02-线性结构3 Reversing Linked List 题目解析

    PTA-mooc完整题目解析及AC代码库:PTA(拼题A)-浙江大学中国大学mooc数据结构全AC代码与题目解析(C语言) Given a constant K and a singly linked ...

  4. 小米嵌入式软件工程师笔试题目解析

    今天分享的是小米的嵌入式软件开发工程师的笔试题目.这份题目很奇怪,操作系统,数据结构,网络基础,Java,C++,数据库,正则表达式,Linux都考到了.当时做题的时候,我都怀疑发错卷子了...还好最 ...

  5. 兆易创新嵌入式软件工程师笔试题目解析

    哈喽,大家好.今天分享的是兆易创新的嵌入式软件开发工程师的笔试题目.这份题目中等难度,考察基础知识的偏多,最后的编程题只考了一个结构体数组的初始化.所以,在准备校招时,将重点还是要放在基础知识上.下面 ...

  6. 2019腾讯游戏安全技术竞赛移动端题目解析

    2019腾讯游戏安全技术竞赛移动端初赛题目解析 前言 前几天朋友发了腾讯游戏安全技术竞赛链接给我,看了看感觉自己挺适合这方面的比赛.我初三买了第一台安卓机子,从root到网络渗透,从美化系统到自制ro ...

  7. 电子学会青少年编程等级考试Python一级题目解析10

    Python一级题目解析 1.题目 下面代码的执行结果是() a = 123456789 b = "*" print("{0:{2}>{1},}\n{0:{2}^{ ...

  8. 电子学会青少年编程等级考试Python一级题目解析11

    Python一级题目解析 题目 (1)下列哪个不是Python的保留字?( )[2020.06] A. if B. or C. do D. for (2)下面哪一个不是Python的保留字?( )[2 ...

  9. 电子学会青少年编程等级考试Python一级题目解析03

    「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. Python一级题目解析 1.题目[20 ...

最新文章

  1. 与江岭师弟的讨论 - 关于形式化逻辑的局限以及其它
  2. Windows下lex 与 yacc的使用
  3. Android之看起来像奔溃了但是没有发现奔溃日志
  4. mysql 转换编码方式
  5. redis value最大值_Redis从入门到深入-String的value
  6. 【HTML5】媒体元素标签audio video
  7. matlab二进制操作,[转载]Matlab二进制类型数据相关操作
  8. 《出发吧一起》第二阶段个人总结——Day01
  9. android开发actionbar,Android 开发之为ActionBar 添加Actionbar Button
  10. qc是什么职位_质量管理部门该干什么?又该怎么干?
  11. 微型计算机是一种将CPU,Bwnhlq计算机一级考试选择题题库之微型计算机基础题及答案(XX年最新版)1.doc...
  12. java反编译 luyten_Java——反编译工具 JD-GUI procyon-decompiler luyten crf (转)
  13. oracle 存档终点修改,修改归档模式的存档终点 archive log list
  14. 井字棋游戏的实现和注意细节
  15. r语言 svycoxph_R语言之生信⑦Cox比例风险模型(单因素)
  16. 三校生计算机教学计划,三校生高考英语教学计划.doc
  17. ESXI6.7.0 升级到7.0U3f(2022年7月12 更新)
  18. 江苏计算机一级证书考试试题,2016年江苏省计算机一级考试试题
  19. 最简便的方法搭建Hexo+Github博客,基于Next主题
  20. python 手动读取cifar10_如何用python解析cifar10数据集图片

热门文章

  1. 三、Oracle/支付宝/旺旺
  2. 资讯_计算机屏幕_镜面屏;
  3. 浅谈微信营销的价值与优势
  4. 电脑的windows键已被停用解决方法
  5. 北京中医药大学本科毕业论文答辩PPT模板
  6. arcgis直方图工具在哪_这些分析工具都分不清?别说你懂数据分析!
  7. 塔望3W消费战略全案丨品类重新定义 打造金皇品高端速食第一面
  8. 【JavaScript】阶段性复习
  9. 手把手教你打通车载蓝牙与手机app的音频信息传输车载反向控制手机app
  10. Java实现第九届蓝桥杯螺旋折线