python学习——算法训练,第二天

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
#找规律
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值