2021-04-05

Python刷题PTA

本周共完成16道
在这里插入图片描述

在这里插入图片描述

第4章-18 猴子选大王 (20 分)

题目:一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

思路
一开始想的是如果碰到3的倍数后就从列表里去掉那个数 可是莫名奇妙第一遍遍历的时候去掉的数就是不正确的 想了半天不知道咋解决 就想着换个方法 多加个列表 如果2列表不存在这个数且这个数正好报到的是3的倍数就加进去 最后输出列表2比列表1缺的那个数就行了

N = int(input())
list1 = []
list2 = []
num = 0
for i in range(1,N+1):
    list1.append(i)
while True:
    for i in list1:
        if i not in list2:
            num += 1
            if num % 3 == 0:
                list2.append(i)
    if len(list2) >= N-1:
        break
for j in list1:
    if j not in list2:
        print(j)

第4章-19 矩阵运算 (20 分)

题目:给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

思路:因为输入里包含回车 所以还是像4-14那样输入 即长度不满足就循环继续输入
因为矩阵第一个元素对于第三个判断条件是不满足的 所以最后输出结果要加上第一个元素

n = int(input())
sum = 0
list1 = list(map(int, input().split()))
while len(list1) < n * n:
    list2 = list(map(int, input().split()))
    list1.extend(list2)
    # 拼接列表
    list2.clear()
for i in range(len(list1)):
    if (i + 1) % n != 0 and i < (len(list1) - n) and i % (n - 1) != 0:
        sum += list1[i]
        #print(list1[i])
print(sum+list1[0])
#print(bool(1 % n != 0))
#print(bool(0 < (len(list1) - n)))
#print(bool(0 % (n - 1) != 0))
# 因为一开始看不出错在哪儿 但是发现了总是第一个元素不会出现 
# 即i为0的时候判断出错 就逐个打印判断结果来检查了

4-21
上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。
本题要求编写程序,判断一个给定的方阵是否上三角矩阵。

写了好久都没成功

第4章-22 找鞍点

题目:一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。本题要求编写程序,求一个给定的n阶方阵的鞍点。

思路:一行一列分别找最大和最小值 存入两个新列表 因为保证鞍点只有一个 所以找到两个列表交集元素就可以了 因为是按顺序来存的 所以所求的数的行纵下标就是它分别在两个列表中的下标

n = int(input())
list1 = list(map(int, input().split()))
while len(list1) < n * n:
    list2 = list(map(int, input().split()))
    list1.extend(list2)
    list2.clear()
big_list = []
small_list = []
big_h = 0
num = 0
small_l = 1000000
for i in range(n):
    for j in range(n):
        if list1[i * n + j] > big_h:
            big_h = list1[i * n + j]
        if list1[i + n * j] < small_l:
            small_l = list1[i + n * j]
    big_list.append(big_h)
    big_h = 0
    small_list.append(small_l)
    small_l = 100000
for i in big_list:
    for j in small_list:
        if i in small_list and j in big_list:
            print(big_list.index(i),small_list.index(i))
        else:
            num += 1
if num == n*2:
    print('NONE')

第4章-23 求矩阵的局部极大值 (15 分)

给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。
思路:感觉用多维数组会简单很多 所以上网学了多维数组的创建和切片使用方法

import numpy
m, n = input().split()
m, n = int(m), int(n)
a = []
num = 0
for i in range(m):
    a.append([])
    # 多维数组的创建
    a[i].append(list(map(int, input().split())))
list1 = numpy.array(a)
# numpy中的array函数
for i in range(1,m-1):
    for j in range(1,n-1):
        #print(list1[i][0][j])
        nc = list1[i][0][j]# nc:nickname
        if nc > list1[i-1][0][j] and nc > list1[i+1][0][j] and nc > list1[i][0][j-1] and nc > list1[i][0][j+1]:
            print(nc,i+1,j+1)
            num += 1
if num == 0:
    print('None',m,n)

感悟:看不懂用法的时候 觉得疑惑就挨个试 试着试着就明白了

4-24

1.通过ljust(),center(),rjust()函数实现输出的字符串左对齐、居中、右对齐

方法一:使用函数默认不带参数,则默认以空格填充

print("|","lulula".ljust(20),"|")    #左对齐
print("|","lulula".center(20),"|")   #居中对齐
print("|","lulula".rjust(20),"|")    #右对齐
#运行结果
| lulula               |
|        lulula        |
|               lulula |

方法二:函数中带参数,则以参数作为填充字符

print("|","lulula".ljust(20,"*"),"|")    #左对齐
#运行结果
| lulula************** |

2.通过format()函数格式化实现左对齐、居中、右对齐

#代码
print("|",format("lulula","*>20"),"|")    #右对齐
print("|",format("lulula","*^20"),"|")   #居中对齐
print("|",format("lulula","*<20"),"|")    #左对齐
#运行结果
| **************lulula |
| *******lulula******* |
| lulula************** |

4-27二维数组中的每行最大值和每行和

思路:全部存入一个列表 循环输出 每三个做一个比较和求和

list1 = list(map(int, input().split()))
for i in range(9):
    print(format(list1[i], ' >4'), end='')
    if (i+1) % 3 == 0:
        print(format(max([list1[i-2], list1[i-1], list1[i]]), ' >4'), end='')
        print(format(sum([list1[i-2], list1[i-1], list1[i]]), ' >4'))

4-28:矩阵转置

思路:一行输出中 下标差距是矩阵的阶数

list1 = list(map(int, input().split()))
for i in range(3):
    print('{:4d}{:4d}{:4d}'.format(list1[i], list1[i+3], list1[i+6]))

第4章-29 找出不是两个数组共有的元素

思路:输入存入两个列表 新建一个列表3存所求元素 分别从下标1的元素开始遍历 用not in 判断是否在另一个列表里存在该元素 没有存在且没出现在列表3里就存入 之后遍历列表3输出即可

4-30:输出完数

思路:这样写测试点里会有两处运行超时 原因应该是给的数比较大时会导致循环次数过多 运行时间过长 所以想到可以第二层循环的时候像求素数那样 只循环到那个数开根的大小 因子列表里直接两个因子同时加入 最后再用sort()函数排序(从小到大)
正确版在第二个

m, n = input().split()
m, n = int(m), int(n)
yin_zi = []
sum1 = 1
num = 0
for i in range(m,n+1):
    for j in range(2,i):
        if i % j == 0:
            yin_zi.append(j)
            sum1 += j
    if sum1 == i:
        print('%d = 1' % i,end='')
        num += 1
        for k in yin_zi:
            print(' + ',end='')
            print(k,end='')
        print(end='\n')
    sum1 = 1
    yin_zi.clear()
if num == 0:
    print('None')

正确版:

import math
m, n = input().split()
m, n = int(m), int(n)
yin_zi = []
sum1 = 1
num = 0
for i in range(m,n+1):
    for j in range(2,int(math.sqrt(i)+1)):
        if i % j == 0:
            yin_zi.append(j)
            sum1 += j
            if j*j != i:
                yin_zi.append(i//j)
                sum1 += i//j
                # // 表整除 自动向下取整 /会得出浮点数
    if sum1 == i:
        yin_zi.sort()
        print('%d = 1' % i,end='')
        num += 1
        for k in yin_zi:
            print(' + ',end='')
            print(k,end='')
        print(end='\n')
    sum1 = 1
    yin_zi.clear()
if num == 0:
    print('None')

5-2:字典的图表示

eval函数:
一、函数的作用
将字符串str当成有效的表达式来求值并返回计算结果。它要执行的python代码只能是单个运算表达式(不支持任意形式的赋值操作),而不能是复杂的代码逻辑。
二、函数的定义
eval(expression, globals=None, locals=None)
参数查找
当后两个参数都为空时,很好理解,就是一个string类型的算术表达式,计算出结果即可。等价于eval(expression)。

当locals参数为空,globals参数不为空时,先查找globals参数中是否存在变量,并计算。

当两个参数都不为空时,先查找locals参数,再查找globals参数。

字典:

判断是否在字典的键中:dict.has_key(key)


列表形式返回字典的键or值:dict.keys() or dict.values()


列表形式返回字典的(key,value)元祖:dict.items()

该题思路:
用eval函数将输入的列表转化为可操作对象 用.value()取得字典的值之后逐个遍历字典 当第一层的值不为空时才进行第二层的遍历 用 if dict != {}:

n = int(input())
ding_dian = 0
bian_shu = 0
bian_chang = 0
while True:
    s = input()
    dic_s = eval(s)
    ding_dian += 1
    for i in dic_s.values():
        if i != {}:
            for j in i.values():
                bian_shu += 1
                bian_chang += j
    if ding_dian > n-1:
        break
print(n, bian_shu, bian_chang)

第5章-3 四则运算(用字典实现) (30 分)
四则运算(用字典实现),比较c语言的switch语句。
输入格式:
在一行中输入一个数字 在一行中输入一个四帜运算符(+,-,*,/) 在一行中输入一个数字
输出格式:
在一行中输出运算结果(小数保留2位)

思路:把除数和被除数存入字典 符号单独 输出时用eval()函数 函数内字符串内的所需的运算符号用格式化字符串代替 :‘a%sb’ % fu_hao

dic = {}

dic['a'] = int(input())
#print(dic)
fu_hao = input()
dic['b'] = int(input())
if dic['b'] == 0:
    print('divided by zero')
else:
    print('%.2f' % eval('a%sb' % fu_hao, dic))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值