用python刷PAT【小结1】


题前闲言
乙级的题目的难度基本上是实现一个简单的基本功能,本次总结的几题中,部分A+BA除以B 为简单题,锤子剪刀布数字黑洞月饼为逻辑题。最近基本上以一天2小时,4个题目的进度刷题。不很费神,主要以熟悉语法为目的,不涉及数据结构,以下内容为给自己做笔记为主。

.050 .100 .150 .200 .250 .300 完成已经5题 完成未总结13题 未完成12题 乙级真题 PAT刷题进度

gatt彩蛋

本期题目总汇

下列题目所涉及的知识点包括:

数据类型,列表查找,sorted排序,列表生成式,字符串补0


部分A+B (15)

【极简单题】
做题思路:获取DA,A,DB,B,在DX中数出X的个数,利用g函数生成PX,然后相加。

[DA,A,DB,B] = raw_input().split()
def g(x,X):
    s=0
    for i in range(x):s=s*10+X
    return s
a = g(DA.count(A),int(A))
b = g(DB.count(B),int(B))
print a+b

代码总结:对于list和str,都存在count方法用于计数。

最简单代码

a, b, c, d = input().split()
print(int(a.count(b) * b or "0") + int(c.count(d) * d or "0"))

技巧点:字符*数字n,会将字符串扩充为长度n的字符串

[in]  's'*5 
[out] 'sssss'

A除以B (20)

【极简单题】
做题思路:此题对于python为有直接方法可以做的题目,对整数做\会得到一个整数,省略余数,%是求余数的方法,也就是求mod的方法。int支持32位(2^31 ~ 2^31-1),此处num1为1000位,所以要用long数据类型

[num1,num2]=raw_input().split()
num1 = long(num1)
num2 = int(num2)
print num1/num2,num1%num2

锤子剪刀布 (20)

【逻辑题】
做题思路:本题实现两个功能:1 计数出甲乙双方输赢;2 求出甲乙双方赢最多的手势。pd函数为判断输赢的函数,高光代码在2的处理方式上,先记录每次赢的时候,甲乙的手势,在进行计数,输出。注意遇到相同时,按字母大小输出,所有有可能都输,或者局数较少,所以没有赢的。

def pd(data):
    if data[0]==data[1]:return 0
    elif data[0]=='C':
        if data[1]=='J':return 1
        else: return -1
    elif data[0]=='B':
        if data[1]=='C':return 1
        else: return -1
    else:
        if data[1]=='B':return 1
        else: return -1 
        
n = int(raw_input())
wcount,pcount = 0,0
jm=[];ym=[]
for i in range(n):
    data=raw_input().split()
    if pd(data)==0:
        pcount=pcount+1
    elif pd(data)==1:
        wcount=wcount+1
        jm.append(data[0])
    else:
        ym.append(data[1])
print wcount,pcount,n-wcount-pcount
print n-wcount-pcount,pcount,wcount

jm=[jm.count(x) for x in 'BCJ']
ym=[ym.count(x) for x in 'BCJ']

print 'BCJ'[jm.index(max(jm))],'BCJ'[ym.index(max(ym))]

高光代码
效果:输出list中个数最多的元素

jm=[jm.count(x) for x in 'BCJ']
print  'BCJ'[jm.index(max(jm))]

五种从list中查找方法:
in/not in/count/index/find,

  • 没有能找到返回每个位置
lst = ['a','a','a','b','c','hello']
'a' in lst              # method 1 返回T or F
'a' not in lst          # method 2 返回T or F
lst.count('a')          # method 3 返回数值
lst.index('a')          # method 4 返回第一次出现的位置,还可以限定在什么范围内,没找到会报错
lst.index('a',2,4) 
lst.find('a')           # method 5 返回第一次出现的位置,没有的话返回-1,适用于字符串


1019. 数字黑洞 (20)

【逻辑题】
做题思路:注意的坑:1 如果输入非四位数的数字,记得要补零;2如果最大最小值相等,则应该输出0000;

# 获得一个数 输出可以变成的最大最小数
def datachange(m):
    m=str(m)
    if len(m)<4:m=m.zfill(4)
    l =map(int,list(m))
    l.sort(reverse=True)
    maxs=0
    for i in l:maxs=maxs*10+i
    l.sort()
    mins=0
    for i in l:mins=mins*10+i
    return [maxs,mins]
#输出函数
def outp(n):
	if n<>0:
    	print str(maxs)+" - " +'%04d'% mins +" = "+str(n)
	else:
    	print str(maxs)+" - " +'%04d'% mins +" = 0000"

n = int(raw_input())
[maxs,mins]=datachange(n)
n = maxs-mins
outp(n)
while n<>6174 and n<>0:
    [maxs,mins]=datachange(n)
    n = maxs-mins
    outp(n)

代码总结
如何优雅的补0:1 zfill函数;2 format格式输出

# method 1
n = '-123'
s = n.zfill(5)
assert s == '-0123'

# method 2 
n = 123
s = '%05d' % n
assert s == '00123'

月饼 (25)

【稍难逻辑题】
做题思路

# data input
mate = raw_input().split()
[n,sumv]=map(int,mate)
v = raw_input().split()
v = map(float,v)
p = raw_input().split()
p = map(float,p)

# data deal
rank = [[vv,pp] for vv,pp in sorted(zip(v,p),key = lambda x:x[1]/(x[0]++0.0001),reverse=True)]
cv=0;cp=0;
for [v,p] in rank:
    cv=cv+v
    cp=cp+p
    if cv>sumv:
        sump = cp-p+(sumv-cv+v)/v*p
        break
    elif cv == sumv:
        sump = cp
        break   
print '%.2f' % sump

代码总结
1.sorted函数的使用
sorted(iterable,cmp,key,reverse=True)
cmp – 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

# 利用cmp函数,放入两个对象,实现了已知顺序,按照顺序排序
[in]   L1 = ['b','a','c','d']
[in]   L2=[2,1,3,4]
[in]   L = zip(L1,L2)
[out]  [('b',2),('a',1),('c',3),('d',4)]
[in]   sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) 
[out]  [('a', 1), ('b', 2), ('c', 3), ('d', 4)]

# 利用key函数,后面加函数
[in]   students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
[in]   sorted(students, key=lambda s: s[2]) #按年龄排序
[out]  [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

其他排序参考

2.列表生成式

[in]   [x * x for x in range(1, 11) if x % 2 == 0]
[out]  [4, 16, 36, 64, 100]

#双层列表生成式
[in]   [m + n for m in 'ABC' for n in 'XYZ']
[out]  ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

#如果存在不同的字符类型注意处理
[in]   L = ['Hello', 'World', 18, 'Apple', None]
[in]   [s.lower() for s in L if isinstance(s, str)]
[out]  ['hello', 'world', 'apple']

# 推广到字典
[in]   d = {'x': 'A', 'y': 'B', 'z': 'C' }
[in]   [k + '=' + v for k, v in d.iteritems()]
[out]  ['y=B', 'x=A', 'z=C']

# 读取系统文件
[in]   import os # 导入os模块,模块的概念后面讲到
[in]    [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
[out]  输出该文件下的所有文件名称

【其他参考链接】

http://www.runoob.com/python3/python3-ascii-character.html

https://www.cnblogs.com/anzhangjun/p/8469242.html

https://blog.csdn.net/helunqu2017/article/details/78659490/

https://www.cnblogs.com/chaofn/p/4592258.html

http://www.doc88.com/p-1018989917105.html

https://www.cnblogs.com/Archie-s/p/6860301.html

http://www.cnblogs.com/Archie-s/p/6861175.html

https://blog.csdn.net/pipisorry/article/category/2558181

https://blog.csdn.net/claroja/article/details/71598572?utm_source=itdadao&utm_medium=referral

http://www.cnblogs.com/hhh5460/p/5816774.html

http://www.cnblogs.com/batteryhp/p/5006274.html

https://www.jb51.net/article/63216.htm

https://www.tuicool.com/articles/2QrYN33

http://www.cnblogs.com/libingql/archive/2011/06/15/2081545.html

http://www.cnblogs.com/chaosimple/p/4153083.html

https://www.tuicool.com/articles/r2yyei

https://blog.csdn.net/jasonding1354/article/details/46239689

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值