python面试 -- 数据处理

题目要求:

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

# -*- 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)  
     该字符串的括号不合法

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值