题目内容:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
输入格式:
一行字符串
输出格式:
True或False,表示该输入是否为合法括号串
输入样例:
([])
输出样例:
True
参考代码模板:
时间限制:500ms内存限制:32000kb
括号匹配算法就是栈的应用。利用列表来模拟入栈出栈过程,遍历遇到左括号入栈,遍历遇到与之左括号匹配的右括号的话,之前的左括号出栈,直到列表为空则表示括号匹配成功,否则匹配失败。
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()))
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()))
题目内容:
根据每日气温列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替
输入格式:
一行以Python表达式格式给出的列表,包含数个整数
输出格式:
整数组成的列表,直接使用print输出
输入样例:
[73, 74, 75, 71, 69, 72, 76, 73]
输出样例:
[1, 1, 4, 2, 1, 1, 0, 0]
参考代码模板:
时间限制:500ms内存限制:32000kb
这个题,我最初是用两个for循环遍历,依次比较得到每个数与后面第一个比它大数的序号差,但是时间复杂度为,并且测试部分通过不了,于是参考了大佬的做法。思路是用栈保存还没遇到大于自己的数组元素的索引,遍历数组元素,跟栈顶元素比较,如果大于栈顶的元素,则保存栈顶元素的结果,并出栈。如果栈非空,继续跟栈顶的元素比较。
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())))
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))
题目内容:
根据后缀表达式表示法,求表达式的值。
有效的运算符包括 +, -, *, / ;其中除法仅保留整数结果。
若出现除数为0或表达式非法的情况,输出"NaN"
注:
每个数字token可包含多位,也可为负数
除法统一使用 int(a / b) 而非 a // b 进行计算
输入格式:
一行字符串,每个token间以空格分隔
输出格式:
一行,包含一个整数或"NaN"
输入样例:
"4 13 5 / +"
输出样例:
6
示例代码模板:
时间限制: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())