python面试 -- 数据处理

来源:互联网 发布:如何打开防火墙端口 编辑:程序博客网 时间:2024/06/02 06:53

题目要求:

       判断给出的字符串中的括号是否合理,若合理,将括号里面的括号删除,其他内容不变,并返回

# -*- coding: utf8 -*-class manager(object):    def __init__(self):        self.symbols_location = list()        self.symbols_count = list()    def islegal(self, s):        '''        判断给出的字符串中括号是否合法        :param s: 字符串        :return: True or False        '''        SYMBOLS = {'}': '{', ']': '[', ')': '('}        SYMBOLS_L, SYMBOLS_R = SYMBOLS.values(), SYMBOLS.keys()        arr = []        for c in s:            if c in SYMBOLS_L:                # 左符号入栈                arr.append(c)            elif c in SYMBOLS_R:                # 右符号要么出栈,要么匹配失败                if arr and arr[-1] == SYMBOLS[c]:                    arr.pop()                else:                    return False        return not arr    def check_symbol_location(self, str):        '''        检查出所有左括号和右括号的位置        左括号计数加1,右括号计算减一,将每次的计数都记录下来,[1, 0]表示刚好出现了成对括号()        :param str: 给出的字符串        :return:        '''        count = 0        for i in range(len(str)):            if str[i] == '(':                self.symbols_location.append(i)                count += 1                self.symbols_count.append(count)            elif str[i] == ')':                self.symbols_location.append(i)                count -= 1                self.symbols_count.append(count)    def symbol_clear_index(self):        '''        遍历括号计算列表,若括号为包含关系时,列表中连续2个值一定是左边的值大于右边的值,且右边的值不等于0        :return: 找出括号包含关系时,子括号在字符串中的索引位置        '''        for i in range(len(self.symbols_count)-1):            if self.symbols_count[i] > self.symbols_count[i+1] and self.symbols_count[i+1]:                index = [self.symbols_location[i], self.symbols_location[i+1]]                del self.symbols_location[i]                del self.symbols_location[i]                del self.symbols_count[i]                del self.symbols_count[i]                return index    def data_manager(self, str):        if self.islegal(str):            s = ''            all_del_symbol = list()            self.check_symbol_location(str)            symbol_index = self.symbol_clear_index()            while symbol_index:                # 循环判断返回的值,若为真,再次调用symbol_clear_index(),直到返回的索引为空                all_del_symbol.extend(symbol_index)                # 将每次返回的需要删除的括号在字符串中的索引位置记录下来                symbol_index = self.symbol_clear_index()            for k, v in enumerate(str):                # 遍历字符串的位置k和值v,将不在需要删除列表中的值记录下来                if k not in all_del_symbol:                    s += v            return '整理后结果为: %s'%s        else:            return '该字符串的括号不合法'if __name__ == "__main__":    manager = manager()    print(manager.data_manager("1 - 2*(17-(60-30+(-40*2/5)*9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2)"))    print(manager.data_manager("1 - 2*(17-(60-30+(-40*(2)/5)*9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2)"))    print(manager.data_manager("1 - 2*(17-60)-30+(-40*2/"))

返回结果如下:

     整理后结果为: 1 - 2*(17-60-30+-40*2/5*9-2*5/3+7/3*99/4*2998+10*568/14)-(-4*3)/(16-3*2)
     整理后结果为: 1 - 2*(17-60-30+-40*2/5*9-2*5/3+7/3*99/4*2998+10*568/14)-(-4*3)/(16-3*2)  
     该字符串的括号不合法

原创粉丝点击