leetcode 726. 原子的數量

給定一個化學式formula(作為字符串),返回每種原子的數量。

原子總是以一個大寫字母開始,接著跟隨0個或任意個小寫字母,表示原子的名字。

如果數量大于 1,原子后會跟著數字表示原子的數量。如果數量等于 1 則不會跟數字。例如,H2O 和 H2O2 是可行的,但 H1O2 這個表達是不可行的。

兩個化學式連在一起是新的化學式。例如 H2O2He3Mg4 也是化學式。

一個括號中的化學式和數字(可選擇性添加)也是化學式。例如 (H2O2) 和 (H2O2)3 是化學式。

給定一個化學式 formula ,返回所有原子的數量。格式為:第一個(按字典序)原子的名字,跟著它的數量(如果數量大于 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}。
示例 4:輸入:formula = "Be32"
輸出:"Be32"

解題思路

使用遞歸實現棧的功能

  1. 當遇到’('時,對括號內的元素進行遞歸
  2. 當遇到’)'時,攜帶map出棧(map內原子個數還需要乘括號后出現的數字,如果沒有,默認為1),回到上一級函數,并且將返回的map進行合并
  3. 在遞歸函數中,遇到字母,即需要處理原子,統計個數,使用treemap記錄該原子出現次數

代碼

class Solution {int next=-1;public String countOfAtoms(String formula) {StringBuilder builder = new StringBuilder();Map<String, Integer> map = count(formula, 0);for (Map.Entry<String, Integer> entry : map.entrySet()) {builder.append(entry.getKey()).append(entry.getValue()==1?"":entry.getValue());}return builder.toString();}public Map<String,Integer> merge(Map<String,Integer> a,Map<String,Integer> b) {for (Map.Entry<String,Integer> c:b.entrySet()){a.put(c.getKey(),a.getOrDefault(c.getKey(),0)+c.getValue());}return a;}public Map<String,Integer> count(final String formula, int l) {Map<String, Integer> map = new TreeMap<String, Integer>();for (int i=l;i<formula.length();){if(formula.charAt(i)=='('){Map<String, Integer> count = count(formula, i + 1);merge(map,count);i=next;}else if(formula.charAt(i)==')'){//后面沒有跟數字,默認值是1if(i+1>=formula.length()||!Character.isDigit(formula.charAt(i+1)))//沒有跟數字next=i+1;else {//把數字提取出來i++;int s=i;while (i<formula.length()&&Character.isDigit(formula.charAt(i)))i++;int cur=Integer.parseInt(formula.substring(s,i));map.replaceAll((k,v)->v*cur);next=i;}return map;} else if(Character.isUpperCase(formula.charAt(i))) {
//遇到大寫字母,如果后面有小寫的也歸于此原子int s = i;i++;while (i < formula.length() && Character.isLowerCase(formula.charAt(i)))i++;String key = formula.substring(s, i);int cur;if (i >= formula.length() || !Character.isDigit(formula.charAt(i)))cur = 1;else {s = i;while (i < formula.length() && Character.isDigit(formula.charAt(i)))i++;cur = Integer.parseInt(formula.substring(s, i));}map.put(key, map.getOrDefault(key, 0) + cur);}}return map;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390546.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390546.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390546.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

web相關基礎知識1

2017-12-13 09:47:11 關于HTML 1.絕對路徑和相對路徑 相對路徑&#xff1a;相對于文件自身為參考。 &#xff08;工作中一般是使用相對路徑&#xff09; 這里我們用html文件為參考。如果說html和圖片平級&#xff0c;那直接使用src 如果說圖片在和html平級的文件夾里面&#xf…

JavaScript循環:標簽語句,繼續語句和中斷語句說明

標簽聲明 (Label Statement) The Label Statement is used with the break and continue statements and serves to identify the statement to which the break and continue statements apply. Label語句與break和continue語句一起使用&#xff0c;用于標識break和continue語…

馬約拉納費米子:推動量子計算的“天使粒子”

據《人民日報》報道&#xff0c;以華人科學家為主體的科研團隊找到了正反同體的“天使粒子”——馬約拉納費米子&#xff0c;從而結束了國際物理學界對這一神秘粒子長達80年的漫長追尋。該成果由加利福尼亞大學洛杉磯分校何慶林、王康隆課題組&#xff0c;美國斯坦福大學教授張…

leetcode 1711. 大餐計數

大餐 是指 恰好包含兩道不同餐品 的一餐&#xff0c;其美味程度之和等于 2 的冪。 你可以搭配 任意 兩道餐品做一頓大餐。 給你一個整數數組 deliciousness &#xff0c;其中 deliciousness[i] 是第 i?????????????? 道餐品的美味程度&#xff0c;返回你可以用…

您的第一個簡單的機器學習項目

This article is for those dummies like me, who’ve never tried to know what machine learning was or have left it halfway for the sole reason of being overwhelmed. Follow through every line and stay along. I promise you’d be quite acquainted with giving yo…

eclipse報Access restriction: The type 'BASE64Decoder' is not API處理方法

今天從svn更新代碼之后&#xff0c;由于代碼中使用了BASE64Encoder 更新之后報如下錯誤&#xff1a; Access restriction: The type ‘BASE64Decoder’ is not API (restriction on required library ‘D:\java\jdk1.7.0_45\jre\lib\rt.jar’) 解決其實很簡單&#xff0c;把JR…

【躍遷之路】【451天】程序員高效學習方法論探索系列(實驗階段208-2018.05.02)...

(躍遷之路)專欄 實驗說明 從2017.10.6起&#xff0c;開啟這個系列&#xff0c;目標只有一個&#xff1a;探索新的學習方法&#xff0c;實現躍遷式成長實驗期2年&#xff08;2017.10.06 - 2019.10.06&#xff09;我將以自己為實驗對象。我將開源我的學習方法&#xff0c;方法不斷…

react jest測試_如何使用React測試庫和Jest開始測試React應用

react jest測試Testing is often seen as a tedious process. Its extra code you have to write, and in some cases, to be honest, its not needed. But every developer should know at least the basics of testing. It increases confidence in the products they build,…

面試題 17.10. 主要元素

題目 數組中占比超過一半的元素稱之為主要元素。給你一個 整數 數組&#xff0c;找出其中的主要元素。若沒有&#xff0c;返回 -1 。請設計時間復雜度為 O(N) 、空間復雜度為 O(1) 的解決方案。 示例 1&#xff1a; 輸入&#xff1a;[1,2,5,9,5,9,5,5,5] 輸出&#xff1a;5 …

簡單團隊-爬取豆瓣電影T250-項目進度

本次主要講解一下我們的頁面設計及展示最終效果&#xff1a; 頁面設計主要用到的軟件是&#xff1a;html&#xff0c;css&#xff0c;js&#xff0c; 主要用的編譯器是&#xff1a;sublime&#xff0c;dreamweaver&#xff0c;eclipse&#xff0c;由于每個人使用習慣不一樣&…

鴿子為什么喜歡盤旋_如何為鴿子回避系統設置數據收集

鴿子為什么喜歡盤旋鴿子回避系統 (Pigeon Avoidance System) Disclaimer: You are reading Part 2 that describes the technical setup. Part 1 gave an overview of the Pigeon Avoidance System and Part 3 provides details about the Pigeon Recognition Model.免責聲明&a…

scrum認證費用_如何獲得專業Scrum大師的認證-快速和慢速方式

scrum認證費用A few months ago, I got the Professional Scrum Master Certification (PSM I). 幾個月前&#xff0c;我獲得了專業Scrum Master認證(PSM I)。 This is a trending certification nowadays, because most companies operate with some sort of agile methodolo…

981. 基于時間的鍵值存儲

創建一個基于時間的鍵值存儲類 TimeMap&#xff0c;它支持下面兩個操作&#xff1a; set(string key, string value, int timestamp) 存儲鍵 key、值 value&#xff0c;以及給定的時間戳 timestamp。 get(string key, int timestamp) 返回先前調用 set(key, value, timesta…

前端開發-DOM

文檔對象模型&#xff08;Document Object Model&#xff0c;DOM&#xff09;是一種用于HTML和XML文檔的編程接口。它給文檔提供了一種結構化的表示方法&#xff0c;可以改變文檔的內容和呈現方式。我們最為關心的是&#xff0c;DOM把網頁和腳本以及其他的編程語言聯系了起來。…

css 繪制三角形_解釋CSS形狀:如何使用純CSS繪制圓,三角形等

css 繪制三角形Before we start. If you want more free content but in video format. Dont miss out on my Youtube channel where I publish weekly videos on FrontEnd coding. https://www.youtube.com/user/Weibenfalk----------Are you new to web development and CSS?…

密碼學基本概念(一)

區塊鏈兄弟社區&#xff0c;區塊鏈技術專業問答先行者&#xff0c;中國區塊鏈技術愛好者聚集地 作者&#xff1a;于中陽 來源&#xff1a;區塊鏈兄弟 原文鏈接&#xff1a;http://www.blockchainbrother.com/article/72 著權歸作者所有。商業轉載請聯系作者獲得授權&#xff0c…

JAVA-初步認識-第十三章-多線程(驗證同步函數的鎖)

一. 至于同步函數用的是哪個鎖&#xff0c;我們可以驗證一下&#xff0c;借助原先賣票的例子 對于程序中的num&#xff0c;從100改為400&#xff0c;DOS的結果顯示的始終都是0線程&#xff0c;票號最小都是1。 票號是沒有問題的&#xff0c;因為同步了。 有人針對只出現0線程&a…

追求卓越追求完美規范學習_追求新的黃金比例

追求卓越追求完美規范學習The golden ratio is originally a mathematical term. But art, architecture, and design are inconceivable without this math. Everyone aspires to golden proportions as beautiful and unattainable perfection. By visualizing data, we chal…

leetcode 275. H 指數 II

給定一位研究者論文被引用次數的數組&#xff08;被引用次數是非負整數&#xff09;&#xff0c;數組已經按照 升序排列 。編寫一個方法&#xff0c;計算出研究者的 h 指數。 h 指數的定義: “h 代表“高引用次數”&#xff08;high citations&#xff09;&#xff0c;一名科研…