1. 程式人生 > >【leetcode】726. Number of Atoms

【leetcode】726. Number of Atoms

app false sel lis 分享圖片 bject bre src enume

題目如下:

技術分享圖片

解題思路:我用的是遞歸的方法,每次找出與第一個‘)‘匹配的‘(‘計算atom的數量後去除括號,只到分子式中沒有括號為止。例如 "K4(ON(SO3)2)2" -> "K4(ONS2O6)2" -> "K4O2N2S4O12"。接下來再對分子式進行分割,得出每個atom的數量後排序即可。原理很簡單,代碼寫得很亂,僅供參考。

代碼如下:

class Solution(object):
    def recursive(self,formula):
        left = right = None
        for i,v in enumerate(formula):
            
if v == (: left = i elif v == ): right = i break if left == None and right == None: return formula lf = formula[:left] parse = formula[left+1:right] times = ‘‘ for i in range(right+1,len(formula)):
if formula[i].isdigit(): times += formula[i] else: if i != len(formula) - 1: i -= 1 break if times != ‘‘: times = int(times) rf = formula[i+1:] if times == ‘‘: ts = parse
else: parseList = [] val = ‘‘ val_num = ‘‘ parse += # for i in parse: #print parseList if i.islower(): val += i #parseList.append(val) elif i.isupper(): if val != ‘‘: parseList.append(val) if val_num != ‘‘: parseList.append(str(int(val_num) * int(times))) val_num = ‘‘ elif val_num == ‘‘ and val != ‘‘: parseList.append(str(times)) val = i elif i.isdigit(): if val != ‘‘: parseList.append(val) val = ‘‘ val_num += i elif i == #: if val != ‘‘: parseList.append(val) if val_num != ‘‘: parseList.append(str(int(val_num) * int(times))) elif val_num == ‘‘ and val != ‘‘: parseList.append(str(times)) ts = ‘‘.join(parseList) return self.recursive(lf + ts + rf) def countOfAtoms(self, formula): """ :type formula: str :rtype: str """ f = self.recursive(formula) i = 1 #print f #transform MgO2H2 -> Mg1O2H2 while i < len(f): if f[i].isupper() and f[i-1].isdigit() == False: f = f[:i] + 1 + f[i:] i = 1 i += 1 if f[-1].isdigit() == False: f += 1 dic = {} key = ‘‘ val = ‘‘ # H11He49N1O35B7N46Li20 for i in f: if i.isdigit(): val += i else: if val == ‘‘: key += i else: if key not in dic: dic[key] = int(val) else: dic[key] += int(val) key = i val = ‘‘ if key not in dic: dic[key] = int(val) else: dic[key] += int(val) keys = dic.keys() keys.sort() res = ‘‘ #print dic for i in keys: res += i if dic[i] > 1: res += str(dic[i]) return res

【leetcode】726. Number of Atoms