C ++中的原子数
假设我们有一个化学式;我们必须找到每个原子的数量。
原子元素将始终以大写字符开头,可以有零个或多个小写字母表示名称。如果计数大于1,则可以跟随1或多个表示该元素计数的数字。但是,如果计数为1,则不跟随数字。例如,H2O和H2O2均有效,但H1O2无效。
因此,如果输入类似于Na2(CO)3,则输出将为C3Na2O3,因此这表示3个碳(C),2个钠(Na),3个氧(O)。
为了解决这个问题,我们将遵循以下步骤-
定义一个函数makeRet(),这将占用一张映射m,
ret:=空字符串
对于m中的每个键值对“it”-
ret:=ret+它的值作为字符串
ret:=ret+键
如果它的值>1,则-
返回ret
定义一个函数countOfAtoms(),需要s,
定义一张映射
定义一个堆栈st
i:=0,n:=s的大小
当我<n时,-
名称:=空字符串
值:=0
名称:=名称+c
而(i<n和s[i]在范围“a”至“z”中)执行-
而(i<n和s[i]在0到9的范围内),则执行-
val:=(如果val与0相同,则为1,否则为val)
m[name]:=m[name]+val
名称:=名称+s[i]
(将i增加1)
val:=val*10+(s[i]-ASCII'0')
(将i增加1)
值:=0
而(i<n和s[i]在0到9的范围内),则执行-
定义一个maptemp:=st的top元素
从st删除元素
对于m中的每个键值对“it”-
m:=温度
val:=val*10+(s[i]-ASCII'0')
(将i增加1)
它的值:=它的值*val
temp[它的键]:=temp[它的键]+它的值
将m插入st
m:=定义一张映射
c:=s[i]
(将i增加1)
如果c与'('相同,则-
否则,当c与')'相同时,则-
除此以外
返回makeRet(m)
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string makeRet(map<string, int> m){
string ret = "";
for (auto& it : m) {
ret += it.first;
if (it.second > 1) {
ret += to_string(it.second);
}
}
return ret;
}
string countOfAtoms(string s){
map<string, int> m;
stack<map<string, int> > st;
int i = 0;
int n = s.size();
while (i < n) {
char c = s[i];
i++;
if (c == '(') {
st.push(m);
m = map<string, int>();
}
else if (c == ')') {
int val = 0;
while (i < n && s[i] >= '0' && s[i] <= '9') {
val = val * 10 + (s[i] - '0');
i++;
}
map<string, int> temp = st.top();
st.pop();
for (auto& it : m) {
it.second *= val;
temp[it.first] += it.second;
}
m = temp;
}
else {
string name = "";
int val = 0;
name += c;
while (i < n && s[i] >= 'a' && s[i] <= 'z') {
name += s[i];
i++;
}
while (i < n && s[i] >= '0' && s[i] <= '9') {
val = val * 10 + (s[i] - '0');
i++;
}
val = val == 0 ? 1 : val;
m[name] += val;
}
}
return makeRet(m);
}
};
main(){
Solution ob;
cout << (ob.countOfAtoms("Na2(CO)3"));
}输入值
Na2(CO)3
输出结果
C3Na2O3