【python】py课后作业程序题4「PTA」

770 阅读12分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

@TOC

7-1 输出星期名缩写

输入一个1到7的数字,输出对应的星期名的缩写。 1 Mon 2 Tue 3 Wed 4 Thu 5 Fri 6 Sat 7 Sun

输入格式: 输入1到7之间数字

输出格式: 输出对应的星期名的缩写

输入样例: 在这里给出一组输入。例如:

1 输出样例: 在这里给出相应的输出。例如:

Mon 思路: 最简单的字典运用了,就是把数字和星期的英文简写对应起来存入dic中然后在根据输入在字典中寻找对应键值的值就可以了

代码区:

n = int(input())
weeks = {1:"Mon", 2:"Tue", 3:"Wed", 4:"Thu", 5:"Fri", 6:"Sat", 7:"Sun"}
print(weeks[n])

7-2 图的字典表示

在这里插入图片描述

图的字典表示。输入多行字符串,每行表示一个顶点和该顶点相连的边及长度,输出顶点数,边数,边的总长度。比如上图0点表示: {'O':{'A':2,'B':5,'C':4}}。用eval函数处理输入,eval函数具体用法见第六章内置函数。

输入格式: 第一行表示输入的行数 下面每行输入表示一个顶点和该顶点相连的边及长度的字符串

输出格式: 在一行中输出顶点数,边数,边的总长度

输入样例: 在这里给出一组输入。例如:

4 {'a':{'b':10,'c':6}} {'b':{'c':2,'d':7}} {'c':{'d':10}} {'d':{}} 输出样例: 在这里给出相应的输出。例如:

4 5 35 思路: 首先因为输入是一个表达式,带有{}号的,所以使用eval方法来将其转化成字典,然后对字典的每一个key都进行遍历记为t,很显然,可以看出输入是有两层字典的,所以我们需要再使用循环来遍历一下这个t,如果存在就把边数加一同时把对应的路径长度给累加起来.

代码区:

n = int(input())
bian = 0
summ = 0
for i in range(n):
    dic = eval(input())
    for j in dic:
        t = dic[j]
        for k in t:
            bian += 1
            summ += t[k]
print(n, bian, summ)

7-3 四则运算(用字典实现)

四则运算(用字典实现),比较c语言的switch语句。

输入格式: 在一行中输入一个数字 在一行中输入一个四帜运算符(+,-,*,/) 在一行中输入一个数字

输出格式: 在一行中输出运算结果(小数保留2位)

输入样例1: 在这里给出一组输入。例如:

7 / 3 输出样例1: 在这里给出相应的输出。例如:

2.33 输入样例2: 在这里给出一组输入。例如:

10 / 0 输出样例2: 在这里给出相应的输出。例如:

divided by zero 思路: 注意:!!数可能是小数,所以要使用float来进行强转,不可以用int哦 将加减乘除四个符号存入字典中,对应的值就是式子的运行结果,需要注意格式为两位小数 然后对于除法时的除数为0进行判断.

代码区:

num1 = float(input())
c = input()
num2 = float(input())
ch = {}
ch["+"] = "{:.2f}".format(num1 + num2)
ch["-"] = "{:.2f}".format(num1 - num2)
ch["*"] = "{:.2f}".format(num1 * num2)
if c == '/' and num2 == 0:
    print("divided by zero")
else:
    ch["/"] = "{:.2f}".format(num1 / num2)
    print(ch[c])

7-4 分析活动投票情况

利用集合分析活动投票情况。第一小队有五名队员,序号是1,2,3,4,5;第二小队也有五名队员,序号6,7,8,9,10。输入一个得票字符串,求第二小队没有得票的队员

输入格式: 在一行中输入得票的队员的序列号,用逗号隔开。

输出格式: 一行中输出第二小队没有得票的队员序号。

输入样例: 在这里给出一组输入。例如:

1,5,9,3,9,1,1,7,5,7,7,3,3,1,5,7,4,4,5,4,9,5,10,9 输出样例: 在这里给出相应的输出。例如:

6 8 思路: 一开始看错了以为时所有人,没想到原来找的只是第二小组的哎,看题要仔细啊 根据逗号来将数字分开存入列表中,然后将全部赋值为0,如果devote中有就加一,最后进行判断是否为0,然后就输出 输出格式有点恶心,最后总是多一个空格,所以需要进行判断是否加空格 (关于全部赋值为0这个操作其实可以使用字典的get方法来简化的,下面的题目中有运用到)

代码区:

devote = [int(n) for n in input().split(',')]
dic = {}
f = True
for i in range(1, 11):
    dic[i] = 0
for i in devote:
    dic[i] += 1
for i in range(6, 11):
    if dic[i] == 0:
        if f:
            print(i, end = '')
            f = False
        else:
            print(f" {i}", end = '')


7-5 统计字符出现次数

本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。

输入格式: 输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。

输出格式: 在一行中输出给定字符在给定字符串中出现的次数。

输入样例: programming is More fun! m 输出样例: 2 思路: 使用get方法就可以在dic中查找有无对应的键值,如果没有就赋值为0,有的话就不进行什么操作,返回的就是该键值的值. 然后看代码就可以一目了然了,这里就不细述了 同时需要注意的时当查找的字母在句子中不存在的时候也要输出0,这是个特殊的情况.

代码区:

string = input()
c = input()
dic = {}
for i in string:
    dic[i] =dic.get(i, 0) + 1
if c not in dic:
    print("0")
else:
    print(dic[c])

7-6 统计工龄

给定公司N名员工的工龄,要求按工龄增序输出每个工龄段有多少员工。

输入格式: 输入首先给出正整数N(≤10 5 ),即员工总人数;随后给出N个整数,即每个员工的工龄,范围在[0, 50]。

输出格式: 按工龄的递增顺序输出每个工龄的员工个数,格式为:“工龄:人数”。每项占一行。如果人数为0则不输出该项。

输入样例: 8 10 2 0 5 7 2 5 2 输出样例: 0:1 2:3 5:2 7:1 10:1 思路: 我这题有点投机取巧了hh,使用了将dict转化为set来达到删除重复值的目的,同时因为dict中的键值都是数字,所以它的ascll码都是按照顺序来的,又因为set的实现是按照hashmap来的,所以就直接生成了一个排序好的了(如果键值不是纯数字,那么set就会生成随机的了)

代码区:

n = int(input())
dic = {}
work_year = [int(year) for year in input().split()]
for year in work_year:
    dic[year] = dic.get(year, 0) + 1
year = set(work_year)
for i in year:
    print(f"{i}:{dic[i]}")

7-7 列表去重

输入一个列表,去掉列表中重复的数字,按原来次序输出!

输入格式: 在一行中输入列表

输出格式: 在一行中输出不重复列表元素

输入样例: 在这里给出一组输入。例如:

[4,7,5,6,8,6,9,5] 输出样例: 在这里给出相应的输出。例如:

4 7 5 6 8 9 思路: 一开始也想使用上一道题的方法来简单的达成,不过这次不行了,因为这次是要保持原有的顺序,这是set所不能做到的,因为set会随机打乱(除非都是纯数字) 所以需要先使用eval来把输入存为列表形式,然后使用sort来根据nums.index来排序,就可以保持原有顺序了.

代码区:

nums = eval(input())
nums = list(set(nums))
nums.sort(key=nums.index)
f = True
for num in nums:
    if f:
        print(num, end = '')
        f = False
    else:
        print(f" {num}", end = '')

7-8 能被3,5和7整除的数的个数(用集合实现)

求指定区间内能被3,5和7整除的数的个数

输入格式: 在一行中从键盘输入2个正整数a,b(1<=a<b<=10000000),用空格隔开。

输出格式: 在一行输出大于等于a且小于等于b的能被3,5和7整除的数的个数。

输入样例1: 在这里给出一组输入。例如:

10 100 输出样例1: 在这里给出相应的输出。例如:

0 输入样例2: 在这里给出一组输入。例如:

1000 100000 输出样例: 在这里给出相应的输出。例如:

943 思路: 思路很简单,就是将能被不同的数整除的数都存入不同的字典中,最后将三个字典进行与操作,这就可以留下三者共有的,也就是能被三个都整除的了.

代码区:

l, h = [int(num) for num in input().split()]
set3 = set()
set5 = set()
set7 = set()
for i in range(l, h + 1):
    if i % 3 == 0:
        set3.add(i)
    if i % 5 == 0:
        set5.add(i)
    if i % 7 == 0:
        set7.add(i)
true_set = set3 & set5 & set7
print(len(true_set))



7-9 求矩阵鞍点的个数

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入格式: 输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

输出格式: 鞍点的个数

输入样例1:

4
1 7 4 1
4 8 3 6 1 6 1 2 0 7 8 9 输出样例1:

1 输入样例2:

2 1 7 4 1 输出样例2:

0 输入样例3:

3 4 7 8 1 3 3 2 3 1 输出样例3:

2 思路: 首先需要定义一个二维列表来存储矩阵数据,然后通过for循环来给列表根据输入赋值.因为要找到每行的最大数以及每列的最小数,所以我这里采用的是列表表达式来完成,将一行或一列的数存在一个列表中,然后使用max或者min方法来求值,然后因为我们要考虑会有重复大的数字,所以不能只考虑只存在一个数的情况,例如3599四个数中9有两个,所以两个列都要进行判断,所以我们要这些数对应的坐标存到r列表中.然后同理将列中的最小数存到c列表中,最后将两个列表转化为set来剔除重复值,再进行与操作,得到符合两个条件的坐标,这也就可以知道存在几个鞍点了.

代码区:

n = int(input())
a = [[0 for _ in range(n)] for _ in range(n)]
r = []
c = []
for i in range(n):
    j = 0
    nums = [int(num) for num in input().split()]
    for m in nums:
        a[i][j] = m
        j += 1
for i in range(n):
    num1 = [a[i][num] for num in range(n)]
    num1 = max(num1)
    num2 = [a[num][i] for num in range(n)]
    num2 = min(num2)
    r += [(i, j) for j in range(n) if a[i][j] == num1]
    c += [(k, i) for k in range(n) if a[k][i] == num2]
set1 = set(r) & set(c)
print(len(set1))

7-10 两数之和

给定一组整数,还有一个目标数,在给定这组整数中找到两个数字,使其和为目标数,如找到,解是唯一的。找不到则显示 "no answer"。输出的下标按从小到大排序。用一重循环加字典实现。

输入格式: 在一行中给出这组数。 在下一行输入目标数

输出格式: 在一行中输出这两个数的下标,用一个空格分开。

输入样例1: 在这里给出一组输入。例如:

2,7,11,15 9 输出样例1: 在这里给出相应的输出。例如:

0 1 输入样例2: 在这里给出一组输入。例如:

3,6,9 10 输出样例2: 在这里给出相应的输出。例如:

no answer 思路: 因为有做法的限制,所以不能直接使用暴力的手段,来使用两个for来强行解决问题了sad,所以需要多考虑会. 遍历每个数,然后将它的"另一半"在字典中找一下,如果没找到就说明时间未到,不过还有机会,所以要将这个数存入字典中等待良缘,如果找到了,那么就输出两个人对应的位置,注意!这里要后输出主动去找的那个人,因为找到的情况肯定是后来的那个人才能完成的,因为有人在等她嘛~,所以不能交换输出的顺序.

代码区:

nums = [int(num) for num in input().split(',')]
n = int(input())
dic = {}
f = 1
for i in range(len(nums)):
    num2 = n - nums[i]
    if dic.get(num2) != None:
        print(dic.get(num2), i)
        f = 0
    dic[nums[i]] = i
if f:
    print("no answer")

7-11 字典合并

输入用字符串表示两个字典,输出合并后的字典。字典的键用一个字母或数字表示。注意:1和‘1’是不同的关键字!

输入格式: 在第一行中输入第一个字典字符串;

在第二行中输入第二个字典字符串。

输出格式: 在一行中输出合并的字典,输出按字典序。

"1" 的 ASCII 码为 49,大于 1,排序时 1 在前,"1" 在后。其它的字符同理。

输入样例1: 在这里给出一组输入。例如:

{1:3,2:5} {1:5,3:7} 输出样例1: 在这里给出相应的输出。例如:

{1:8,2:5,3:7} 输入样例2: 在这里给出一组输入。例如:

{"1":3,1:4} {"a":5,"1":6} 输出样例2: 在这里给出相应的输出。例如:

{1:4,"1":9,"a":5} 思路: 又是存在格式问题!!烦死了 首先遍历dic2,然后都加到dic1,具体就不叙述了,因为需要进行排序,所以要先转化为列表,来调用sort,根据键值的Ascll码来进行排,我们需要进行判断,如果是字符就直接使用ord转化,如果是数字就保留原样. 因为有万恶的格式问题,所以要先转化为str再使用replace方法来进行替换,将单引号变成双引号,空格取消.注意要这么写("'", '"'),双引号包单引号,单引号包双引号.

代码区:

dic1 = eval(input())
dic2 = eval(input())
for i in dic2:
    dic1[i] = dic1.get(i, 0) + dic2[i]
dic1 = list(dic1.items())
dic1.sort(key=lambda k: ord(k[0]) if type(k[0]) == str else k[0])
dic1 = str(dict(dic1))
dic1 = dic1.replace("'", '"').replace(' ', '')
print(dic1)

新手上路,(几乎不会是最优解,轻点打)有错请指正;