前三周的题目相对简单,大概比较麻烦的是最后一个题。
1. 空心等腰三角形:a. 注意给 input 强制转换 int;b. 把打印分为顶点、腰和底边三部分;c. 因为每一行边占一个字符,所以每行两侧空格要在半边长的基础上 -1;
# 输出空心等腰三角形
length = int(input("请输入底边边长:"))
halfL = (length - 1) // 2
# 打印顶点
print(' ' * halfL + '#' + ' ' * halfL)
# 打印中部
for sp in range(halfL - 1):
print(' ' * (halfL - sp - 1) + '#' + ' ' * (2 * sp + 1) + "#" + ' ' * (halfL - sp - 1))
# 打印底部
print('#' * length)
2. 替换单词:可以用 while i < len(word) 循环,这样在检测到‘e’的时候,马上继续检测下一个字符,如果还是 ‘e’ 就一起改,并将i 自加 1,跳过一个字符;
# 纯字母单词替换
word = input("请输入单词:")
replaced = ''
# 替换单词
i = 0
while i < len(word):
if word[i] == ('e' or 'E'):
if word[i+1] == ('e' or 'E'):
replaced += 'E3'
i += 1
else:
replaced += '3'
else:
replaced += word[i]
i += 1
# 打印单词
print('替换后的单词为:' + replaced)
2. A / B 问题:似乎有人更推荐 python 格式化字符用 str.format;
# A/B 问题
# 输入两个数
a = int(input())
b = int(input())
# 判断除数
if b==0:
print('NA')
else:
q = a/b
print("{:.4f}".format(q))
最小数:需要多练习解析列表的使用;
# 找最小数
# 输入
line = input()
# 分离数字
numbers = line.split(' ')
# 转换成数字类型
numbers = [int(x) for x in numbers]
# 依次对比
min = numbers[0]
for num in numbers[1:]:
if num < min:
min = num
# 输出最小值
print(min)
实心矩形,没啥说的,基本语言回顾
# 画实心矩形
# 输入参数
para = input()
# 区分行列值
m,n = para.split(' ')
# 输出矩形
for col in range(int(m)):
print('*'*int(n))
括号匹配:这题老师课上也有类似的实例讲解。
# 匹配括号
left = '([{'
right = ')]}'
# 检查闭合括号是否匹配
def match(op,end):
# 判断是否匹配
if left.index(op) == right.index(end):
return True
else:
return False
# 输入字符串
line = input()
# 新建堆栈用于存放左括号
check = []
# 标记是否正确
flag = True
# 字符串不为空
if len(line):
for ch in line:
# 字符为左括号
if ch in left:
check.append(ch)
continue
# 字符为右括号
elif ch in right:
# 此字符之前存在左括号
if len(check) != 0:
# 检查是否匹配
if match(check.pop(), ch):
continue
else:
flag = False
break
else:
flag = False
break
# 判断是否匹配
if flag:
print('True')
else:
print('False')
线性碰对消除:
# 线性碰对消除
# 输入字符串
line = input()
# 字符串不为空
if len(line):
# 新建堆栈用于获取最终结果
elimi = [line[0]]
for ch in line[1:]:
# 堆栈内有字符
if len(elimi) > 0:
# 字符与堆栈尾一致
if ch == elimi[-1]:
elimi.pop()
# 不一致
else:
elimi.append(ch)
else:
elimi.append(ch)
# 输出最终结果
if elimi == []:
print('None')
else:
print(''.join(elimi))
强迫症:这题太好玩了,开始看了半天没看懂,后来看论坛里小伙伴的讨论才明白,归纳起来就是这么几个条件:
这个店只有10盘子,每人只能拿一个(所以每一轮只能接10个人);
这个店的脏盘子必须得攒够10个,在开业的时候才开始洗;
老板要求洗碗工必须按照0-9递增的顺序清洗标好号的盘子,中途还可能有人来拿盘子;
老板按顺序给顾客盘子记编号,并通过取盘顺序推断洗碗工是否听话(可能老板比较清闲);
由此推断,这个故事情节来自于某“霸道总裁爱上我”的小说,一来老板不考虑营业额,二来老板盯着洗碗工不放,哈哈。
最后这道题我认为关键在于考虑盘子顺序的合理性:后面的数字(记为数字Y)可以大于前面的(数字X);但如果Y小于X,那么Y应该是紧接着它前一个未被占用的数字。因此我想到了两种实现方法:
a.可做一个0-9的列表,每取走一个盘子pop掉对应的数字,这样就能知道“紧接着它前一个未被占用的数字”是几;
b.也可以检查数字Y和数字X中间的数字是否已存在于之前的列表中,如果中间的所有数字都已被占用,那么这个顺序就是合理的。
# 强迫症老板
'''
后面的数字(设为数字Y)可以大于前面的(设为数字X);如果小于前面的,
那么这个数应该是紧接着的前一个(a.可做一个0-9的列表,每取走一个盘子
pop掉对应的数字;b.也可以检查数字Y和数字X中间的数字是否已存在于
之前的列表中,)
'''
def compare(seq):
# 新建判断堆栈
queue = [seq[0]]
# 依次比较
for num in seq[1:]:
if num < queue[-1]:
# 如果区间内某数字不存在
for n in range(queue[-1] - 1, num, -1):
if not (n in queue):
return 'No'
queue.append(num)
else:
queue.append(num)
return 'Yes'
# 输入序列
series = [int(ch) for ch in input()]
print(compare(series))
总的来说主要还是 python 的基础知识回顾,当然后散体包含了栈的思维方式。