kotlin完成 Code War 题目 解析分子公式
题目
对于由字符串表示的给定化学式,计算分子中包含的每个元素的原子数并返回一个对象: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 题目 解析分子公式相关推荐
- 电子学会青少年编程等级考试Python一级题目解析12
Python一级题目解析 1.题目(2021.03) 写一个计算长方形面积的程序,并对每行代码进行相应的注释,要求如下: (1)采用多行注释,说明程序的功能(如下): "计算长方形的面积 并 ...
- Mysql窗口函数 (知识点梳理+题目解析+面试实战)(四万字长文,一文读懂,建议收藏后食用)
前言: 本文章是原创50篇时开启的纪念作,之前的文章基本5000字,而本篇约4.5万字,真一篇顶九篇. 窗口函数作为Mysql 8的新特性以及面试笔试的重点,掌握并且进行来练习是非常有必要的.本文章详 ...
- PTA 02-线性结构3 Reversing Linked List 题目解析
PTA-mooc完整题目解析及AC代码库:PTA(拼题A)-浙江大学中国大学mooc数据结构全AC代码与题目解析(C语言) Given a constant K and a singly linked ...
- 小米嵌入式软件工程师笔试题目解析
今天分享的是小米的嵌入式软件开发工程师的笔试题目.这份题目很奇怪,操作系统,数据结构,网络基础,Java,C++,数据库,正则表达式,Linux都考到了.当时做题的时候,我都怀疑发错卷子了...还好最 ...
- 兆易创新嵌入式软件工程师笔试题目解析
哈喽,大家好.今天分享的是兆易创新的嵌入式软件开发工程师的笔试题目.这份题目中等难度,考察基础知识的偏多,最后的编程题只考了一个结构体数组的初始化.所以,在准备校招时,将重点还是要放在基础知识上.下面 ...
- 2019腾讯游戏安全技术竞赛移动端题目解析
2019腾讯游戏安全技术竞赛移动端初赛题目解析 前言 前几天朋友发了腾讯游戏安全技术竞赛链接给我,看了看感觉自己挺适合这方面的比赛.我初三买了第一台安卓机子,从root到网络渗透,从美化系统到自制ro ...
- 电子学会青少年编程等级考试Python一级题目解析10
Python一级题目解析 1.题目 下面代码的执行结果是() a = 123456789 b = "*" print("{0:{2}>{1},}\n{0:{2}^{ ...
- 电子学会青少年编程等级考试Python一级题目解析11
Python一级题目解析 题目 (1)下列哪个不是Python的保留字?( )[2020.06] A. if B. or C. do D. for (2)下面哪一个不是Python的保留字?( )[2 ...
- 电子学会青少年编程等级考试Python一级题目解析03
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. Python一级题目解析 1.题目[20 ...
最新文章
- 与江岭师弟的讨论 - 关于形式化逻辑的局限以及其它
- Windows下lex 与 yacc的使用
- Android之看起来像奔溃了但是没有发现奔溃日志
- mysql 转换编码方式
- redis value最大值_Redis从入门到深入-String的value
- 【HTML5】媒体元素标签audio video
- matlab二进制操作,[转载]Matlab二进制类型数据相关操作
- 《出发吧一起》第二阶段个人总结——Day01
- android开发actionbar,Android 开发之为ActionBar 添加Actionbar Button
- qc是什么职位_质量管理部门该干什么?又该怎么干?
- 微型计算机是一种将CPU,Bwnhlq计算机一级考试选择题题库之微型计算机基础题及答案(XX年最新版)1.doc...
- java反编译 luyten_Java——反编译工具 JD-GUI procyon-decompiler luyten crf (转)
- oracle 存档终点修改,修改归档模式的存档终点 archive log list
- 井字棋游戏的实现和注意细节
- r语言 svycoxph_R语言之生信⑦Cox比例风险模型(单因素)
- 三校生计算机教学计划,三校生高考英语教学计划.doc
- ESXI6.7.0 升级到7.0U3f(2022年7月12 更新)
- 江苏计算机一级证书考试试题,2016年江苏省计算机一级考试试题
- 最简便的方法搭建Hexo+Github博客,基于Next主题
- python 手动读取cifar10_如何用python解析cifar10数据集图片