《数据结构与算法Python版》作业题思路以及自我总结·第一~三章

前三周的题目相对简单,大概比较麻烦的是最后一个题。

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))

强迫症:这题太好玩了,开始看了半天没看懂,后来看论坛里小伙伴的讨论才明白,归纳起来就是这么几个条件:

  1. 这个店只有10盘子,每人只能拿一个(所以每一轮只能接10个人);

  2. 这个店的脏盘子必须得攒够10个,在开业的时候才开始洗;

  3. 老板要求洗碗工必须按照0-9递增的顺序清洗标好号的盘子,中途还可能有人来拿盘子;

  4. 老板按顺序给顾客盘子记编号,并通过取盘顺序推断洗碗工是否听话(可能老板比较清闲);

  5. 由此推断,这个故事情节来自于某“霸道总裁爱上我”的小说,一来老板不考虑营业额,二来老板盯着洗碗工不放,哈哈。

最后这道题我认为关键在于考虑盘子顺序的合理性:后面的数字(记为数字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 的基础知识回顾,当然后散体包含了栈的思维方式。

你可能感兴趣的:(学习心得,菜鸟入门)