美文网首页
2021-04-26pta终结刷题

2021-04-26pta终结刷题

作者: Cipolee | 来源:发表于2021-04-26 18:02 被阅读0次

c++的map映射可以提前规定好映射的格式,然后可以根据键值直接添加
python的dict使用{}初始化,不能直接根据键值添加,否则为nonetye

总结pta1095

list函数append只接受一个参数,有些排序问题可以append([a,b])进行

编程经验,遇到大的任务不要慌,分解成小功能挨个实现,同时清楚每个小功能是什么

  • 切片要认准对什么切片,例如字典切片item[0]还是item[1]
  • 功能的内聚和耦合观念,什么样的功能放main里什么样的功能放子函数里
  • 想办法把重复的代码抽象为不重复的代码,增加代码复用性
#存在运行超时问题
#把关于case项的输出放在外面控制
def case1(charac):
    #使用显式的字母判断反而不能体现出抽象了
    list_charac=[]
    for item in all_info.items():
        if charac in item[0]:
            list_charac.append([item[0],item[1]])
    list_charac=sorted(list_charac,key=lambda x:x[0])
    list_charac=sorted(list_charac,key=lambda x:x[1],reverse=True)
    if len(list_charac)==0:
        print('NA')
    else:
        for i in list_charac:
            print(i[0],i[1])
def case2(hallid):
    num_allp,num_alls=0,0
    flag=False
    for item in all_info.items():
        if item[0][1:4]==hallid:
            flag=True
            num_allp+=1
            num_alls+=item[1]
    if not flag:
        print("NA")
    else:
        print(num_allp,num_alls)
def case3(date):
    #numP descent,if equal hallid ascent
    dict_case3,list_case3={},[]
    for item in all_info.items():
        #print(item[0][4:10],date)
        if item[0][4:10]==date:
            dict_case3[item[0][1:4]]=dict_case3.get(item[0][1:4],0)+1
    for item in dict_case3.items():
        list_case3.append([item[0],item[1]])
    if len(list_case3)==0:
        print('NA')
    else:
        list_case3=sorted(list_case3,key=lambda x:x[0])#sorted 是稳定排序
        list_case3=sorted(list_case3,key=lambda x:x[1],reverse=True)
        for i in list_case3:
            print(i[0],i[1])
num_student,num_move=map(int,input().split())
all_info={}
for _ in range(num_student):
    per_info=input().split()
    all_info[per_info[0]]=int(per_info[1])
for i in range(num_move):
    case,info=input().split()
    print("Case {}: {} {}".format(i+1,case,info))
    if case=='1':
        case1(info)
    elif case=='2':
        case2(info)
    elif case=='3':
        case3(info)
    else:
        pass

case1函数的抽象程度就比较高,并没有分A,B,T三类讨论写三遍代码,应该作为经验


1094谷歌的招聘

1.减法与range掺了,原本减法已经和list的下标吻合了,range又向前取了一位

在大数量级单次判断素数不应使用筛法,可能内存会爆

#按照字符串分割为长度为4的大小
#时间复杂度为线性,可以做,转换为数字使用列表存储,再判断是否位素数(最早,应该使用筛法来做(不可))
#小于10的正整数#单纯筛选10亿大小的量,应该会超时
#大长度的素数题反而不能使用爱是筛选法,否则内存会爆,判断素数注意1不是素数需要特殊处理
'''
list_prime=[]
num_length,num_prime=map(int,input().split())
index=[True]*(10**10)
for i in range(2,10**10):
    if index[i]:
        list_prime.append(i)
    for j in range(i*2,10**10,i):
        index[j]=False
'''
#那儿出错了????
import math
num_length,num_prime=map(int,input().split())
def isPrime(n):
    if n==1:
        return false
    flag=True
    for i in range(2,int(math.sqrt(n))+1):
        if n%i==0:
            flag=False
            break
    return flag
list_num=[]
str_data=input()
for i in range(0,num_length-num_prime+1):
    list_num.append(int(str_data[i:i+num_prime]))
#print(list_num)
flag,ans=False,0
for i in list_num:
    if isPrime(i):
        print('0'*(num_prime-len(str(i)))+str(i))
        flag=True
        break
        
if not flag:
    print('404')

1090危险品装箱

数据结构选用正确,后面循环问题出了低级错误,跳过本次循环使用continue,退出循环用break一定要分清

如何找bug,上溯分支法,定位到错误位置

能运行,并能处理简单数据说明语法没问题,可能是逻辑问题

需要掌握提供数据的能力

  • (提供答案运行条件,是否运行,运行几次,常用语“---”,“here run”,“happend!!”)。
  • 输出数据与数据类型,看看数据是否正确
#很容易超时,单纯遍历的话
num_cant,num_gruop=map(int,input().split())
dict_cant={}
for _ in range(num_cant):
    list_per=input().split()
    try:
        if list_per[0] in dict_cant:
            #dict_cant[list_per[0]]=dict_cant[list_per[0]].append(list_per[1])
            dict_cant[list_per[0]].append(list_per[1])
        else:
            dict_cant[list_per[0]]=[list_per[1]]
    except:
        print("there happend something wrong")
    try:
        if list_per[1] in dict_cant.keys():
            #dict_cant[list_per[1]]=dict_cant[list_per[1]].append(list_per[0])
            dict_cant[list_per[1]].append(list_per[0])
        else:
            dict_cant[list_per[1]]=[list_per[0]]
    except:
        print("something wrong")
#使用字典存储所有可能冲突的组合
for _ in range(num_gruop):
    list_group=input().split()
    flag=True
    #print("------------------------")
    #print(type(dict_cant[list_group[1]]))
    #print(dict_cant)
    #print(list_group)
    for i in range(1,len(list_group)):
        #print('to do')#运行一次
        if not flag:
            break
        else:
            if list_group[i] not in dict_cant:
                #print('has hapend not in keys!')#运行一次
                continue
            for j in range(i+1,len(list_group)):
                #print(i,j)#没运行
                #if i==2 and j==4:
                 #   print(list_group[j], dict_cant[list_group[i]])
                if list_group[j] in dict_cant[list_group[i]]:
                  #  print('happend!!')
                    flag=False
                    break
    if flag:
        print("Yes")
    else:
        print("No")
    '''    '''

记录程序日志,以防对同一问题处理两边

1092最好吃的月饼,有处理意外输入的的意识

num_mooncookie,num_cities=map(int,input().split())
list_num=[0]*(num_mooncookie+2)
for _ in range(num_cities):
    list_per=input().split()
    for i in range(num_mooncookie):
        list_num[i+1]+=int(list_per[i])
max_=max(list_num)
print(max_)
ans=[]
for i in range(len(list_num)):
    if list_num[i]==max_:
        ans.append(str(i))#list_num产生的时候已经做了处理,ans直接按list_num的索引来即可
if max_==0:
    ans=[str(i) for i in range(1,num_mooncookie+1)]
    print(' '.join(ans))
else:
    print(' '.join(ans))

深入理解题意类 1092 字符串A+B (20 分)

给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集。要求先输出 A,再输出 B,但重复的字符必须被剔除。

input
This is a sample test
to show you_How it works
output
This ampletowyu_Hrk

#区分大小写,自己和自己也要有约束,看看目前的是否在前面
#保留两个原始输入
str1=input()
str2=input()
ans=''
for i in str1:
    if i not in ans:
        ans+=i
for i in str2:
    if i not in ans:
        ans+=i
print(ans)

自认为 有艺术感的代码
函数抽象,与函数内部处理都非常棒,以后多看看
1084 外观数列 (20 分)

def theNextOne(str_):
    index,cnt,ans=0,0,''
    for i in str_:
        if str_[index]==i:
            cnt+=1
        else:
            ans+=str_[index]+str(cnt)
            index+=cnt
            cnt=1
    if index==0:
        ans=str_[0]+str(cnt)
    elif index<len(str_):
        ans+=str_[-1]+str(cnt)
    #print("ans is ",ans)
    return ans

def getSequenceThe(start,num):
    for _ in range(num):
        start=theNextOne(start)
    return start

x,y=input().split()
print(getSequenceThe(x,int(y)-1))

1088 三人行 (20 分)
7个点第6个过不了,数学思想,解出变量(使用循环看是否满足所有关于该变量的函数(一般都过换元消除了其他的变量))

#思路求出三个人的成绩,数据量较小直接比较
#和自己的分数比较

score_me,time1,time2=map(int,input().split())
if score_me>=100:
    print("No Solution")
else:#求3个人的分数,先求甲的
    max1,flag=0,False
    
    for i in range(10,100):
        if (time2+time1)*int(str(i)[::-1])/time2==i:
            flag=True
            max1=i
        if (time2-time1)*int(str(i)[::-1])/time2==i:
            flag=True
            max1=i
    #甲的值为i
    if max1==0 and not flag:
        print("No Solution")
    else:
        A,B=max1,int(str(max1)[::-1])
        C=B/time2
        print(A,end='')
        for i in [A,B,C]:
            if i>score_me:
                print(' Cong',end='')#i是三人中的分数
            elif i<score_me:
                print(' Gai',end='')
            else:
                print(' Ping',end='')
        print()

满分版本
get_index()函数对以后写法有指导意义

def main():
    M, X, Y = (int(x) for x in input().split())
    answer = 'No Solution'
    # 先假设没有答案
    compare = ['Ping', 'Gai', 'Cong']
    # 待会用M 与甲乙丙三人的能力值制造对应的下标
    for a in range(99, 9, -1):
        # 甲就是a,从99到10尝试各种可能
        flag, b, c = check(a, X, Y)
        if flag:
            # 找到第一个答案
            answer = "{} {} {} {}".format(a, compare[get_index(M, a)], compare[
                                          get_index(M, b)], compare[get_index(M, c)])
            break
            # 只需要一个甲取值最大的就可以了,记得break出去
    print(answer)
    # 输出答案


def get_index(a, b):
    # 根据 M 和 甲乙丙的大小关系计算下标
    if a == b:
        # 对应compare[0] == 'Ping'
        return 0
    else:
        # 对应compare[-1] == 'Gai' 和 compare[1] == 'Cong'
        return int((a - b) / abs(a - b))


def check(a, X, Y):
    # 判断 甲是a时,是否满足条件。
    b = float(str(a)[::-1])
    c = b / Y
    # c 可能是一个浮点数,本题的一个坑点。
    if abs(a - b) == X * c:
        return (True, b, c)
    else:
        return (False, 0, 0)


if __name__ == '__main__':
    main()

相关文章

  • 2021-04-26pta终结刷题

    c++的map映射可以提前规定好映射的格式,然后可以根据键值直接添加python的dict使用{}初始化,不能直接...

  • 刷题刷题

    时间紧迫,任务繁重,又有疫情影响,搞的人心惶惶,一时间复习得不安宁,又舍不得摆烂。 在焦灼、惶恐的情绪中,紧张急迫...

  • 2022-09-16

    刷题,刷题还是刷题

  • 2018-07-16

    刷题,祸害的何止是教育? 报班,刷题;买练习册,刷题;家教,刷题;跟不上,刷题;学得好,刷题;为了抢跑,刷题;为了...

  • 刷题啊刷题

    因为月底又要考试,所以最近几天一直在刷题。按说是看了书再看视频再刷题效果比较好才是。可是来不及了啊。 上次考试,就...

  • 刷题啊刷题

    刷题啊刷题 因为11月中旬要举行期中考试,所以最近几天,学校精心组织,一直在刷题。按说是看了书再看PPT课件或教师...

  • 2020-02-01关于刷题的几个建议

    算法刷题 针对性刷题,刻意练习。刻意刷题!不是麻木刷题!刷题前一定要先看书,清楚明白为什么要刷这些题,这些题刷完能...

  • 刷题

    清早起来刷题 吃饭也在刷题 上厕所也在刷题 中午也在刷题 下午也在刷题 晚上也在刷题 一天到晚都在刷题 考试马上到...

  • 程序猿刷题网站你知道吗?

    Coderbyte 刷题网LeetCode 刷题网Stack Overflow 刷题网

  • 教你怎么做一只考试锦鲤

    考试前14天疯狂刷题,各个平台疯狂刷题,刷题就对了。 刷的越多,大脑记得越多,也许你刷10道题,能记住的只有1道题...

网友评论

      本文标题:2021-04-26pta终结刷题

      本文链接:https://www.haomeiwen.com/subject/lokerltx.html