MOOC数据结构与算法Python版-第三周编程作业

1 有效的括号(10分)

题目内容:

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。

  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

 

输入格式:

一行字符串

 

输出格式:

True或False,表示该输入是否为合法括号串

 

输入样例:

([])

 

输出样例:

True

 

参考代码模板:

 

  1. def isValid(s):
  2.     ### code here
  3.  
  4. print(isValid(input()))

时间限制:500ms内存限制:32000kb

解题思路:

括号匹配算法就是栈的应用。利用列表来模拟入栈出栈过程,遍历遇到左括号入栈,遍历遇到与之左括号匹配的右括号的话,之前的左括号出栈,直到列表为空则表示括号匹配成功,否则匹配失败。

程序代码1:

def isValid(s):
    dic = {'(': ')', '[': ']', '{': '}'} #使用字典存储括号,左括号为key,右括号为value
    stack = []  #设置一个列表,把该列表当做栈来使用即可。
    for i in s:
        if i in dic.keys():
            stack.append(i)   #左括号入栈
        elif i in dic.values():
            if len(stack) == 0 or dic.get(stack[-1]) != i:  #与右括号进行比较
                return False
            else:
                stack.pop()  #匹配正确则出栈一个
    if len(stack) == 0:
        return True
    else:
        return False

print(isValid(input()))

程序代码2:

def isValid(s):
    length = len(s)
    stack = []
    for i in range(0, length):
        if (s[i] == '{' or s[i] == '(' or s[i] == '['):
            stack.append(s[i])
        else:
            if (len(stack) != 0):
                tmp = stack.pop()
                if (s[i] == '}' and tmp != "{"):
                    return False
                if (s[i] == ')' and tmp != "("):
                    return False
                if (s[i] == ']' and tmp != "["):
                    return False
            else:
                return False
    if (len(stack) != 0):
        return False
    return True

print(isValid(input()))

2 每日温度(10分)

题目内容:

根据每日气温列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替

 

输入格式:

一行以Python表达式格式给出的列表,包含数个整数

 

输出格式:

整数组成的列表,直接使用print输出

 

输入样例:

[73, 74, 75, 71, 69, 72, 76, 73]

 

输出样例:

[1, 1, 4, 2, 1, 1, 0, 0]

 

参考代码模板:

 

  1. def dailyTemp(T):
  2.     ### code here
  3.  
  4. t = eval(input())
  5. print(dailyTemp(t))

时间限制:500ms内存限制:32000kb

解题思路:

这个题,我最初是用两个for循环遍历,依次比较得到每个数与后面第一个比它大数的序号差,但是时间复杂度为O(n^{2}),并且测试部分通过不了,于是参考了大佬的做法。思路是用栈保存还没遇到大于自己的数组元素的索引,遍历数组元素,跟栈顶元素比较,如果大于栈顶的元素,则保存栈顶元素的结果,并出栈。如果栈非空,继续跟栈顶的元素比较。

程序代码1:

def dailyTemp(T):

    stack = []
    res = [0 for _ in T]
    for i in range(len(T) - 1):
        if T[i] < T[i + 1]:
            res[i] = 1
            while len(stack) != 0 and T[i + 1] > T[stack[len(stack) - 1]]:
                res[stack[len(stack) - 1]] = i + 1 - stack[len(stack) - 1]
                stack.pop()
        else:
            stack.append(i)

    return res
print(dailyTemp(eval(input())))

程序代码2:

def dailyTemp(T):
    temp = []
    res = [0 for i in range(len(T))]
    for i in range(len(T)):
        while len(temp) != 0 and T[i] > T[temp[-1]]:
            res[temp[-1]] = i - temp[-1]
            temp.pop()
        temp.append(i)
    return res

t = eval(input())
print(dailyTemp(t))

 

3 后缀表达式求值(10分)

题目内容:

根据后缀表达式表示法,求表达式的值。

有效的运算符包括 +, -, *, / ;其中除法仅保留整数结果。

若出现除数为0或表达式非法的情况,输出"NaN"

注:

  1. 每个数字token可包含多位,也可为负数

  2. 除法统一使用 int(a / b) 而非 a // b 进行计算

 

输入格式:

一行字符串,每个token间以空格分隔

 

输出格式:

一行,包含一个整数或"NaN"

 

输入样例:

"4 13 5 / +"

 

输出样例:

6

 

示例代码模板:

 

  1. def calc(tokens):
  2.     ### code here
  3.  
  4. print(calc(input().split()))

时间限制:500ms内存限制:32000kb

解题思路:

这个题不难,但要注意一些坑。

1.题目要求输入字符串是带引号输入的,所以我们遍历时要先把引号去掉。

2.遍历时,遇到数字就入栈,遇到加减乘除符号就将之前的两个数字出栈做运算。

3.要注意题目输入可以是负数。

4.做出栈运算要注意分母不能为0。

5.注意判断是否为非法输入,比如输入"[ 5 2 + -"或者"abcd"或者“5 +”等不符合要求的字符串。

程序代码:

def doMath(x, y, op):
    if op == "+":
        return x + y
    elif op == "-":
        return x - y
    elif op == "*":
        return x * y
    elif op == "/" and y !=0: #分母不为0
        return int(x / y)     #取整
    else:
        return 'NaN'       #有可能分母为0

def calc(exp):
    stack = []                  #创建一个列表当栈使用
    exp = exp.replace("\"","")  #将字符串两边的引号去掉
    for i in exp.split():
        try:
            if i in '+-*/':     #遍历字符串,如果是+-*/其中一个的话,就将a,b出栈做运算,#否则就添加栈中
                b = stack.pop()
                a = stack.pop()
                stack.append(doMath(a,b,i))
            else:
                stack.append(eval(i))
        except:
            stack.append('NaN')
    if len(stack) == 1: #栈的长度为1,出栈,有可能是非法输入全部加到栈里,就输出NaN
        print(stack.pop())
    else:
        print('NaN')
calc(input())

 

 

你可能感兴趣的:(Python,数据结构)