华为20190410研发笔试第二题:字符串展开

【题目描述】

给定一个字符串,字符串可以包含数字、大小写字母及括号(包括大括号、中括号和小括号)。括号
可以嵌套,即括号中可以出现数字和括号。按照下列的规则对字符串进行展开,不用考虑括号成对不
匹配的问题,用例保证括号匹配,同时保证每个数字后面都有括号,不用考虑数字后面没有括号的情
况:即2a2(b)。

  1. 数字表示括号内字符串重复的次数,展开后的字符串不包含括号;
  2. 将字符串逆序展开。

输出最终的字符串

【输入描述】
输入一个长度小于100的字符串。

【输出描述】
输出展开后的字符串。

【测试用例】
【输入】
abc3(A)
【输出】
AAAcba

【解题思路】
采用栈的思想。

def printString(strings):
    stack = []
    for s in strings:
        if s.isalpha():
            stack.append(s)
        elif s.isdigit():
            stack.append(s)
        elif s == '{' or s == '[' or s == '(':
            stack.append(s)
        else:  # 如果遇到右括号,则出栈到第一个左括号
            temp = []
            # 取出括号中的内容
            while stack[-1] != '{' and stack[-1] != '[' and stack[-1] != '(':
                temp.insert(0, stack.pop(-1))
            # 弹出遇到的第一个左括号
            stack.pop(-1)
            # 取出左括号前的数字,数字可能不只有一位:
            num = []
            count = 0
            while stack[-1].isdigit():
                num.insert(0, stack.pop(-1))
            # 计算需要重复的次数
            for i in range(len(num)):
                count = count * 10 + int(num[i])
            # 重复括号中的字符串
            temp = temp * count
            # 将重复好的字符串再压入栈中
            for t in temp:
                stack.append(t)

    # 出栈
    while stack:
        print(stack.pop(-1), end='')
    print('')


if __name__ == '__main__':
    strings = 'abc2[A3(B)]'
    printString(strings)

你可能感兴趣的:(python,笔试)