• 【leetcode】726. Number of Atoms


    题目如下:

    解题思路:我用的是递归的方法,每次找出与第一个')'匹配的'('计算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
            
  • 相关阅读:
    安卓学习Day11
    J2EE-Day09-Servlet
    J2EE-Day08-Tomcat
    安卓学习Day10
    安卓学习Day09
    安卓学习Day08
    安卓学习Day07
    安卓学习Day06
    YII 1.0 常用CURD写法
    php 封装原生数据导出的方法(csv文件格式)和csv文件中长数字自动变成科学计数法的处理
  • 原文地址:https://www.cnblogs.com/seyjs/p/9417866.html
Copyright © 2020-2023  润新知