热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[栈递归]LeetCode726.原子的数量

题目描述给出化学式,计算化学式中所有出现原子以及原子个数,字典序升序输出一个括号中的化学式和数字(可选择性添加)也是化学式。例如(H2O2)和(H2O2)3是化学式。思路看

题目描述

给出化学式,计算化学式中所有出现原子以及原子个数,字典序升序输出
一个括号中的化学式和数字(可选择性添加)也是化学式。例如 (H2O2) 和 (H2O2)3 是化学式。


思路

看到括号典型的递归,用栈写递归更加方便一点。
顺便可以学习一下C++ map和stack的用法
map的特性:



  1. key值不能重复,如果是数字或者string char等会自动排序非常适用这道题

  2. log级复杂的增删改以及搜索

  3. 可以直接用数组方式进行检索并对value值操作

具体思路:
非括号内的原子直接进入答案map
括号内原子进入栈,碰到右括号则括号内原子个数乘以相应数字,再放回栈
如果栈内没括号了那么栈内原子进入map
可以再写一个pair数组维护,将栈中元素弹出存入数组中,碰到栈中左括号停止,此时如果栈空,那么数组所有元素进入map,否则全部入栈
元素进入map不需要find,直接map[string]+=num即可


代码

bool isbig(char a){return a>='A'&&a<='Z';}bool issmall(char a){return a>='a'&&a<='z';}bool isnum(char a){return a>='0'&&a<='9';}int tonum(string a){if(a.length()==0)return 1;int res=0;for(int i=0;i<a.length();i++){res=res*10+a[i]-'0';}return res;}string countOfAtoms(string formula) {stack<pair<string,int>>q;stack<pair<string,int>>tmpstack;pair<string,int>tmppair;map<string,int>ans;int type=1,n=formula.length();string tmpstr="";string tmpnum="";for(int i=0;i<n;i++){char c=formula[i];if(isbig(c)){tmpstr+=c;i++;c=formula[i];while(issmall(c)&&i<n){tmpstr+=c;i++;c=formula[i];}while(isnum(c)&&i<n){tmpnum+=c;i++;c=formula[i];}if(type==1)ans[tmpstr]+=tonum(tmpnum);else q.push({tmpstr,tonum(tmpnum)});tmpstr.clear();tmpnum.clear();i--;}else if(c=='('){q.push({"",0});type=2;}else if(c==')'){i++;c=formula[i];while(isnum(c)&&i<n){tmpnum+=c;i++;c=formula[i];}int x=tonum(tmpnum);tmpnum.clear();while(!q.empty()){tmppair=q.top();q.pop();if(tmppair.second==0)break;tmpstack.push({tmppair.first,tmppair.second*x});}if(!q.empty()){while(!tmpstack.empty()){q.push(tmpstack.top());tmpstack.pop();}}else{while(!tmpstack.empty()){tmppair=tmpstack.top();tmpstack.pop();ans[tmppair.first]+=tmppair.second;}type=1;}i--;}}string res="";for(auto it:ans)if(it.second!=1)res=res+it.first+to_string(it.second);else res=res+it.first;return res;}

推荐阅读
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 如何在JavaScript中实现字符到ASCII码的转换 ... [详细]
  • 2.2 组件间父子通信机制详解
    2.2 组件间父子通信机制详解 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 在C语言中,指针的高级应用及其实例分析具有重要意义。通过使用 `&` 符号可以获取变量的内存地址,而 `*` 符号则用于定义指针变量。例如,`int *p;` 定义了一个指向整型的指针变量 `p`。其中,`p` 代表指针变量本身,而 `*p` 则表示指针所指向的内存地址中的内容。此外,指针在不同函数中可以具有相同的变量名,但其作用域和生命周期会有所不同。指针的灵活运用能够有效提升程序的效率和可维护性。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 在C语言中,常用的字符和字符串处理函数对于程序开发至关重要。这些函数定义在标准库中,如`stddef.h`中的`size_t`表示无符号整数。本文详细解析了字符和字符串处理函数的应用,特别是查找功能的相关实现。通过具体示例,展示了如何高效地使用这些函数进行字符串操作和字符处理,为开发者提供了实用的参考。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 在探讨P1923问题时,我们发现手写的快速排序在最后两个测试用例中出现了超时现象,这在意料之中,因为该题目实际上要求的是时间复杂度为O(n)的算法。进一步研究题解后,发现有选手使用STL中的`nth_element`函数成功通过了所有测试点。本文将详细分析这一现象,并提出相应的优化策略。 ... [详细]
  • 在本文中,我们将为 HelloWorld 项目添加视图组件,以确保控制器返回的视图路径能够正确映射到指定页面。这一步骤将为后续的测试和开发奠定基础。首先,我们将介绍如何配置视图解析器,以便 SpringMVC 能够识别并渲染相应的视图文件。 ... [详细]
  • 本文探讨了利用JavaScript实现集合的对称差集算法的方法。该算法旨在处理多个数组作为输入参数,同时保留每个数组中元素的原始顺序。算法不会移除单个数组内的重复元素,但会删除在不同数组之间出现的重复项。通过这种方式,能够有效地计算出多个数组的对称差集。 ... [详细]
author-avatar
失意的汐_194
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有