您的位置:首页 > 其它

Number of Atoms--LeetCode

2017-11-23 00:24 288 查看
最近刷了一道算法题 
Number of Atoms,原题链接Number of Atoms发现网上几乎没什么答案,可能是题号太靠后的原因吧,做出来之后收获挺多的,打算分享一下。

这道题的tag是HashTable、Stack和Recursion,拿到题的第一感觉就是有两种解法,一种是stack,一种是递归,两种解法都要用到hashTable。想到了数据结构与算法课学到的逆波兰式,决定用stack的方法求解。

具体的做法就是借助stack,一层一层的去括号,知道去除最外层的括号,然后把相同的元素的数量加一下(用map<string,int>数据结构,统计数量的同时排个序)。具体细节看代码吧,欢迎提问。也欢迎改进代码。class Solution {
public:
string countOfAtoms(string formula) {
map<string, int>ele_count_map;
stack<char>formula_stack;
string s;
for (int i = 0; i < formula.size(); i++) {
s = "";
if (formula[i] == ')') {
while (formula_stack.top() != '(') {
s += formula_stack.top();
formula_stack.pop();
}
formula_stack.pop();
reverse(s.begin(), s.end());
if (i + 1 < formula.size() && isdigit(formula[i+1])) {
string rateString = "";
int rate;
while (i + 1 < formula.size() && isdigit(formula[i + 1])) {
rateString+= formula[i + 1];
i++;
}
rate = stoi(rateString);
s = countRecursion(s, rate);
}
for (int j = 0; j < s.size(); j++) {
formula_stack.push(s[j]);
}
}
else formula_stack.push(formula[i]);
}
s = "";
while (!formula_stack.empty()) {
s += formula_stack.top();
formula_stack.pop();
}
reverse(s.begin(), s.end());
string ele;

for (int i = 0; i < s.size(); i++) {
int rate;
ele = "";
if (isupper(s[i])) {
ele += s[i];
while (i + 1<s.size() && islower(s[i+1])) {
ele += s[i + 1];
i++;
}
if (i + 1 < s.size() && isdigit(s[i+1])) {
string srate="";

while (i + 1 < s.size() && isdigit(s[i+1])) {
srate += s[i + 1];
i++;
}
rate = stoi(srate);
}
else rate = 1;
ele_count_map[ele]+= rate;
rate = 0;
}
}
s = "";
for (auto it = ele_count_map.begin(); it != ele_count_map.end(); it++) {
s += it->first;
if(it->second>1)
s += to_string(it->second);
}
return s;
}
string countRe
4000
cursion(string formula,int rate) {
string s = "";
string srate = "";//
for (int i = 0; i < formula.size(); i++) {
if (isupper(formula[i])) {
s += formula[i];
while (i+1<formula.size()&&islower(formula[i+1])){
s += formula[i + 1];
i++;
}
if (i + 1 < formula.size() && isdigit(formula[i+1]))
{
while (i + 1 < formula.size() && isdigit(formula[i + 1]))
{
srate += formula[i + 1];
i++;
}
s += to_string(rate*stoi(srate));
srate = "";
}
else if (i + 1 < formula.size() && !isdigit(formula[i])) { s += to_string(rate); }
}
if (i+1 == formula.size()&&formula[i]>=65)
s += to_string(rate);
}
return s;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: