2022-08-30:给你一个字符串化学式 formula ,返回 每种原子的数量 。
原子总是以一个大写字母开始,接着跟随 0 个或任意个小写字母,表示原子的名字。
如果数量大于 1,原子后会跟着数字表示原子的数量。如果数量等于 1 则不会跟数字。
例如,“H2O” 和 “H2O2” 是可行的,但 “H1O2” 这个表达是不可行的。
两个化学式连在一起可以构成新的化学式。
例如 “H2O2He3Mg4” 也是化学式。
由括号括起的化学式并佐以数字(可选择性添加)也是化学式。
例如 “(H2O2)” 和 “(H2O2)3” 是化学式。
返回所有原子的数量,格式为:第一个(按字典序)原子的名字,跟着它的数量(如果数量大于 1),
然后是第二个原子的名字(按字典序),跟着它的数量(如果数量大于 1),以此类推。
示例 1:
输入:formula = “H2O”
输出:“H2O”
解释:原子的数量是 {‘H’: 2, ‘O’: 1}。
示例 2:
输入:formula = “Mg(OH)2”
输出:“H2MgO2”
解释:原子的数量是 {‘H’: 2, ‘Mg’: 1, ‘O’: 2}。
示例 3:
输入:formula = “K4(ON(SO3)2)2”
输出:“K4N2O14S4”
解释:原子的数量是 {‘K’: 4, ‘N’: 2, ‘O’: 14, ‘S’: 4}。

答案2022-08-30:

递归。遇到左括号,进入递归;遇到右括号,退出递归。要用到TreeMap,rust里是std::collections::BTreeMap。

代码用rust编写。代码如下:

use std::collections::BTreeMap;
fn main() {
let s = "K4(ON(SO3)2)2";
let ans = count_of_atoms(s);
println!("ans = {}", ans);
}
fn count_of_atoms(str: &str) -> String {
let s = str.as_bytes();
let info = process(s, 0);
let mut builder: String = String::new();
for (key, _) in info.cnt_map.iter() {
builder.push_str(key);
let cnt = *info.cnt_map.get(key).unwrap();
if cnt > 1 {
builder.push_str(&format!("{}", cnt));
}
}
return builder;
} pub struct Info {
cnt_map: BTreeMap<String, i32>,
end: i32,
} impl Info {
pub fn new(c: BTreeMap<String, i32>, e: i32) -> Self {
Self { cnt_map: c, end: e }
}
} fn process(s: &[u8], i: i32) -> Info {
let mut cnt_map: BTreeMap<String, i32> = BTreeMap::new();
let mut cnt = 0;
let mut builder: String = String::new();
let mut info: Info = Info::new(BTreeMap::new(), 0);
let mut i = i;
while i < s.len() as i32 && s[i as usize] != ')' as u8 {
if s[i as usize] >= 'A' as u8 && s[i as usize] <= 'Z' as u8 || s[i as usize] == '(' as u8 {
if builder.len() != 0 || info.end != 0 {
cnt = if cnt == 0 { 1 } else { cnt };
if builder.len() != 0 {
let key = builder.clone();
cnt_map.insert(
key.clone(),
if cnt_map.contains_key(&key.clone()) {
*cnt_map.get(&key.clone()).unwrap() + cnt
} else {
cnt
},
);
for _ in 0..builder.len() {
builder.remove(0);
}
} else {
for (key, _) in info.cnt_map.iter() {
cnt_map.insert(
key.clone(),
if cnt_map.contains_key(key) {
*cnt_map.get(key).unwrap()
} else {
0
} + *info.cnt_map.get(key).unwrap() * cnt,
);
}
info = Info::new(BTreeMap::new(), 0);
}
cnt = 0;
}
if s[i as usize] == '(' as u8 {
info = process(s, i + 1);
i = info.end + 1;
} else {
builder.push(s[i as usize] as char);
i += 1;
}
} else if s[i as usize] >= 'a' as u8 && s[i as usize] <= 'z' as u8 {
builder.push(s[i as usize] as char);
i += 1;
} else {
cnt = cnt * 10 + s[i as usize] as i32 - '0' as i32;
i += 1;
}
}
if builder.len() != 0 || info.end != 0 {
cnt = if cnt == 0 { 1 } else { cnt };
if builder.len() != 0 {
let key = builder.clone();
cnt_map.insert(
key.clone(),
if cnt_map.contains_key(&key.clone()) {
*cnt_map.get(&key.clone()).unwrap() + cnt
} else {
cnt
},
);
for _ in 0..builder.len() {
builder.remove(0);
}
} else {
for (key, _) in info.cnt_map.iter() {
cnt_map.insert(
key.clone(),
if cnt_map.contains_key(key) {
*cnt_map.get(key).unwrap()
} else {
0
} + *info.cnt_map.get(key).unwrap() * cnt,
);
}
}
}
return Info::new(cnt_map, i);
}

执行结果如下:


左神java代码

2022-08-30:给你一个字符串化学式 formula ,返回 每种原子的数量 。 原子总是以一个大写字母开始,接着跟随 0 个或任意个小写字母,表示原子的名字。 如果数量大于 1,原子后会跟着数的更多相关文章

  1. 字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符 parseInt() 函数可解析一个字符串,并返回一个整数。

    split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如 ...

  2. 已知一个字符串S 以及长度为n的字符数组a,编写一个函数,统计a中每个字符在字符串中的出现次数

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 21:04 * @description ...

  3. Java中将一个字符串传入数组的几种方法

    String Str="abnckdjgdag"; char a[]=new char[Str.length()]; -------------------方法1 用于取出字符串的 ...

  4. 给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应模式。

    这个是LeetCode上的一道题目.本机上运行时正确的,但是LeetCode上显示是错误的,所以没有办法了只能记录在博客上了. 我的想法是先把pattern和str都转化成数组.例如"abb ...

  5. (转)sscanf() - 从一个字符串中读进与指定格式相符的数据

    (转)sscanf() - 从一个字符串中读进与指定格式相符的数据 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, stri ...

  6. 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)

    给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...

  7. 290.单词模式。给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。(c++方法)

    题目描述: 给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式. 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之 ...

  8. js中如何判断一个字符串包含另外一个字符串?

    js中判断一个字符串包含另外一个字符串的方式比较多? 比如indexOf()方法,注意O是大写. var test="this is a test"; if(test.indexO ...

  9. JavaScript确定一个字符串是否包含在另一个字符串中的四种方法

    一.indexOf() 1.定义 indexOf()方法返回String对象第一次出现指定字符串的索引,若未找到指定值,返回-1.(数组同一个概念) 2.语法 str.indexOf(searchVa ...

  10. JAVA经典题--计算一个字符串中每个字符出现的次数

    需求:  计算一个字符串中每个字符出现的次数 思路: 通过toCharArray()拿到一个字符数组--> 遍历数组,将数组元素作为key,数值1作为value存入map容器--> 如果k ...

随机推荐

  1. Python读写Excel文件第三方库汇总,你想要的都在这儿!

    常见库简介 xlrd xlrd是一个从Excel文件读取数据和格式化信息的库,支持.xls以及.xlsx文件.http://xlrd.readthedocs.io/en/latest/1.xlrd支持 ...

  2. 一个struts1框架的小案例

    具体如下: <span style="font-size:18px;"><?xml version="1.0" encoding=" ...

  3. 痞子衡嵌入式:在i.MXRT1060-EVK上利用memtester程序给SDRAM做压力测试

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在i.MXRT1060-EVK上利用memtester程序给SDRAM做压力测试. 我们知道恩智浦i.MXRT1xxx系列是高性能MCU ...

  4. 网络安全(中职组)-B模块:Web安全应用-2

    Web安全应用-2 任务环境说明: √ 服务器场景: match_win03-3-1(关闭链接) √ 服务器场景操作系统:Windows Server 2003 1. 使用渗透机Kali Linux, ...

  5. 非侵入式入侵 —— Web缓存污染与请求走私

    作者:vivo 互联网安全团队- Gui Mingcheng 本文介绍了两种攻击者无需直接接触服务端即可攻击和影响用户行为的安全漏洞 -- Web缓存污染与请求走私.Web缓存污染旨在通过攻击者向缓存 ...

  6. 2.错误代码C2440

    错误 C2440 "初始化": 无法从"const char [5]"转换为"char *" 从整型强制转换为指针类型要求 reinterp ...

  7. FastCorrect:语音识别快速纠错模型丨RTC Dev Meetup

    前言 「语音处理」是实时互动领域中非常重要的一个场景,在声网发起的「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」活动中,来自百度.寰宇科技和依图的技术专家,围绕该话题进行了相 ...

  8. protobuf 详解

    protobuf protobuf概述 protobuf简介 Protobuf是Protocol Buffers的简称,它是Google公司开发的一种数据描述语言,是一种轻便高效的结构化数据存储格式, ...

  9. 基于VirutalBox搭建虚拟机间互通的可访问公网的mini主机群

    目标 在单台PC机上安装3+台虚拟机[1] 这些虚拟机间可以相互访问 宿主机[2]与虚拟机可以相互访问 虚拟机可以访问公网 本文将采用 NAT + Host-Only 双网卡的方式实现上述目标,因为采 ...

  10. Java设计模式 —— 建造者模式

    8 建造者模式 8.1 建造者模式概述 Builder Pattern:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式可以将部件本身和它们的组装过程分开,关注如 ...