python刷题训练集
第二天
1.简单密码
现在有一种密码变换算法。
九键手机键盘上的数字与字母的对应: 1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0,把密码中出现的小写字母都变成九键键盘对应的数字,如:a 变成 2,x 变成 9.
而密码中出现的大写字母则变成小写之后往后移一位,如:X ,先变成小写,再往后移一位,变成了 y ,例外:Z 往后移是 a 。
数字和其它的符号都不做变换。
while True:#字典法
try:
A="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
B="22233344455566677778889999bcdefghijklmnopqrstuvwxyza0123456789"
list1=[]
list2=[]
for i in A:
list1.append(i)
for i in B:
list2.append(i)
C=[]
a=input()
for i in a:
if i in list1:
C.append(list2[list1.index(i)])
else:
C.append(i)
print(''.join(C))
except:
2.汽水瓶
某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。
小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
数据范围:输入的正整数满足 1 \le n \le 100 \1≤n≤100
# 因为可以跟老板借,那我们直接贪心一下,每两个空瓶子就跟老板借一个空瓶子,喝完了再还给他
while True:
try:
a = int(input())
b = a // 2 #每2个空瓶就换一瓶汽水
if b != 0:
print(b)
else:
continue
except:
break
3.删除字符串中出现次数最少的字符
实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
while True:
try:
s = input()
dic, res = {}, ''
for c in s:
if c not in dic:
dic[c] = 1
else:
dic[c] += 1
Min = min(dic.values())
for c in s:
if dic[c] != Min:
res += c
print(res)
except:
break
4.单词倒排
对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
while True:
try:
a = input()
a = a.split() #将输入的字符串以空格分开
for i in range(len(a)):
b = list(a[i]) #将a中的一个字符串每个字符分开为列表
len_i = len(b)
for j in range(len_i): #对于每个字符
if(b[j].isupper() == False) & (b[j].islower() == False):
b[j] = ' ' #若不是大写或者小写字母,则变为空格
a[i] = ''.join(b) #合并为字符串
c = ' '.join(a) #每个字符串用空格分开(原本的句子每个单词中间的空格)
c = c.split(' ') #按照空格分开 (原本的句子中的单词空格和非字母字符变为的空格)
c = c[::-1] #逆序
print(' '.join(c)) #按要求输出
except:
break
5.图片整理
Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过代码解决。
Lily使用的图片使用字符"A"到"Z"、“a"到"z”、"0"到"9"表示。
while True:
try:
a = input()
a = list(a) #将字符串放入列表中,每个字符为一项
for i in range(len(a)):
a[i] = ord(a[i]) #先转化为ASCLL码
a.sort() #按照ASCLL排序
for i in range(len(a)):
a[i] = chr(a[i]) #再将每个ASCLL还原为字符
print(''.join(a)) #按要求输出
except:
break
6.蛇形矩阵
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
例如,当输入5时,应该输出的三角形为:
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
题解:
第一行[1 3 6 10 15]
第二行是 去掉第一行的第一列,然后将后面的[3 6 10 15]分别减1得到的。
while True:
try:
N=int(input())
res=[]
for i in range(N):
if i==0: #算出第一行
res=[(e+2)*(e+1)//2 for e in range(N)]
else: #第一行去掉第一列后,每个值减1
res=[e-1 for e in res[1:]]
print(' '.join(map(str,res)))
except:
break
7.统计每个月兔子的总数
有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。
例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。
一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
题解:
斐波那契数列:1 1 2 3 5 8 13 21 34 f(n)=f(n-1)+f(n-2) n>2,n从0开始
month=int(input())
L=[]
for i in range(month):
if i<2:#前两个月都为1
total=1
L.append(total)
else:
total=L[i-1]+L[i-2]#之后均为前两个数的和
L.append(total)
print(L[-1])#最后的列表L=[1, 1, 2, 3, 5, 8, 13, 21, 34]
8.统计字符串
输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数。
题解:
简单来说,就是使用不同字符串对应的ASCii码进行判断就好了
m = input()
res1 = 0 #英文字符个数
res2 = 0 #空格字符个数
res3 = 0 #数字字符个数
res4 = 0 #其他字符个数
for i in m:
if 65 <= ord(i) <= 90 or 97 <= ord(i) <= 122:
res1 += 1
elif i == " ":
res2 += 1
elif 48 <= ord(i) <= 57:
res3 += 1
else:
res4 += 1
print(res1)
print(res2)
print(res3)
print(res4)
9.输出单向链表中倒数第k个结点
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。
- 列表法
while True:
try:
l = int(input())
s = input().split()
k = int(input())
if k != 0:
print(s[l-k])
except:
break
- 链表法
class Node(object):
def __init__(self, val=0):
self.val = val
self.next = None
while True:
try:
head = Node()
count, num_list, k = int(input()), list(map(int, input().split())), int(input())
while k:
head.next = Node(num_list.pop())
head = head.next
k -= 1
print(head.val)
except EOFError:
break
10.杨辉三角的变形
以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数、左上角数和右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。
求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3,输入2则输出-1。
题解:
第三行之前都没有偶数,第三行之后,第一个偶数出现的位置是周期性的,[2,3,2,4]循环
while True:
try:
n=int(input())
res=-1
if n<=2:
res=-1
elif n%2==1:
res=2
elif n%4==0:
res=3
else:
res=4
print(res)
except:
break
#找规律