题前闲言
乙级的题目的难度基本上是实现一个简单的基本功能,本次总结的几题中,部分A+B,A除以B 为简单题,锤子剪刀布 ,数字黑洞, 月饼为逻辑题。最近基本上以一天2小时,4个题目的进度刷题。不很费神,主要以熟悉语法为目的,不涉及数据结构,以下内容为给自己做笔记为主。
gatt彩蛋
本期题目总汇
下列题目所涉及的知识点包括:
数据类型,列表查找,sorted排序,列表生成式,字符串补0
【极简单题】
做题思路:获取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'
【极简单题】
做题思路:此题对于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
【逻辑题】
做题思路:本题实现两个功能: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,适用于字符串
【逻辑题】
做题思路:注意的坑: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'
【稍难逻辑题】
做题思路:
# 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