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

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)

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

猜你喜欢

转载自blog.csdn.net/qq_33884853/article/details/124621563