题目1:打印一个九九乘法表
需求分析:
99乘法表的样子?
思路:
1、两层循环用
2、外层循环range(1,10)
3、内层循环range(1,i+1)
4、完成乘法的表达式
5、内层循环结束后外层每循环一次就打印一次换行
答案:
for i in range(1,10):
for j in range(1,i+1):
print(f'{j}', '*', f'{i}', '=', i * j, end=' ')
print()
题目2:在 0~99 之间随机抽取一个偶数
需求分析:
1、偶数就是可以被2整除的数
2、范围是0-99
3、随机
思路:
1、使用random
2、random.randint(a, b) 返回一个随机整数 N,范围是:a <= N <= b
3、随机抽取一个,所以取到满足条件的就要跳出循环
答案:
import random
while True:
a = random.randint(0,99)
if a % 2 ==0:
print(a)
break
题目3:编写一个双色球的开奖模拟程序。
需求分析:
1、双色球有红蓝两种颜色的球
2、中奖号码是6个随机红球加一个随机
3、红球是1-33
4、篮球是1-16
思路:
1、随机取多个用random.sample(population, k)
2、红球和篮球拼起来就是开奖结果
3、range(a,b)
从a
开始到b-1
答案:
import random
while True:
red = random.sample(range(1,34),6)
blue = random.sample(range(1,17),1)
break
print("本期开奖结果为:",red ,' ', blue)
题目4:计算 1000000 以内所有偶数的和。
需求分析:
1、偶数怎么表示?x % 2 == 0
2、累加的偶数
思路:
找规律
1,1
2,2
3,4
5,8
6,16
7,32
n,2^(n-1)
答案:
num = 1
for i in range(1,65):
num += pow(2,i-1)
print(num)
题目5:模拟抛硬币,打印出每次抛掷的结果
需求分析:
1、如果抛硬币的次数小于 100,则打印每次的结果,否则不打印
2、统计最终正面和反面的次数
思路:
1、用随机模块
2、从内向外,先实现最基本的随机打印正反面
3、把循环体放到外层条件下
答案:
import random
n = int(input("请输入抛硬币的次数:"))
coin = ['正面','反面']
count1 = 0
acoin = 0
bcoin = 0
if n < 100:
for i in range(n):
ran = random.randint(0,1)
print(coin[ran])
count1 +=1
if coin[ran] == '正面':
acoin+=1
else:
bcoin+=1
else:
for i in range(n):
ran = random.randint(0,1)
count1 +=1
if coin[ran] == '正面':
acoin+=1
else:
bcoin+=1
print(f"总共投掷了{count1}次")
print(f'正面:{acoin}次')
print(f'反面:{bcoin}次')
题目6:倒着打印99乘法表
需求分析:
给出了倒着打印的样式
思路:
1、两层循环
答案:
"""
倒着打印99乘法表--for循环的写法
"""
for i in range(1,10):
for j in range(9,i,-1):
print(j,'*',i ,'=',j*i,end=' ')
print(1)
"""
倒着打印99乘法表--while循环的写法
"""
i = 1
while i <= 9:
j = 9
while j >= i:
print(j,'*',i ,'=',j*i,end=' ')
j -= 1
print()
i+=1
题目7:找出占比数量最多的两个元素
需求分析:
1、这两个元素的数量都需要超过总数的三分之一
2、摩尔投票法
思路
1、长度//3表示三分之一
2、循环列表中的每一个元素,并计算出现的次数
3、当出现的次数大于三分之一时,append到一个新的列表
4、由于循环可能导致重复的结果,可以讲列表转成set(集合)
答案:
a = [5,5,5,6,4,6,4,6,6,5,4,3,3,5,4,5,4,6,6,6,5,6,5,5,6]
thirda = len(a)//3
# print(len(a))
# print(thirda)
b = []
for i in range(len(a)):
if a.count(a[i]) > thirda:
b.append(a[i])
c = set(b)
print(c,"是出现次数超过1/3的数字")
题目8:找出列表中出现次数最多的一个数字
需求分析:
1、给定的列表 a = [5,5,5,6,4,6,4,6,6,5,4,3,3,5,4,5,4,6,6,6,5,6,5,5,6]
2、打印出出现次数最多的数字和其出现的次数
思路:
1、遍历列表
2、找到每个元素出现的次数:
3、将次数append
到一个空列表
4、max
这个列表就能求出出现次数最多的次数,此时只是次数,还不知道谁出现了这么多次
5、如果将去重后的a
中的每个数字遍历出来,作为key
放到一个空字典中,把每个key
出现的次数作为value
放到字典的值中,那么遍历这个字典就可以得到出现次数最多的key
和其对应的次数value
答案:
"""
方法1:
这里用了max方法和count方法
max(a,key=a.count) a,是一个可迭代对象,这里指列表a,key 参数指定一个用于比较的函数,在这里我们比较的是a中每个元素出现的次数,所以a.count。
既然max是出现次数最多的元素,那么a.count(max)就是这个元素出现的次数了
"""
a = [5,5,1,6,4,6,4,6,6,5,4,3,3,5,4,5,4,6,6,6,5,6,5,5,6]
max = max(a,key=a.count)
print(max,'是出现次数最多的数,总共出现了',a.count(max),'次')
方法2:
"""
下面的a = list(d.keys())[list(d.values()).index(max(b))可能不太好理解,其实就是使用列表的index方法求得下标索引,并且通过下标索引求值
"""
a = [5,5,1,6,4,6,4,6,6,5,4,3,3,5,4,5,4,6,6,6,5,6,5,5,6]
b = []
d = {}
for i in a:
j = a.count(i)
d[i]=j
b.append(j)
a = list(d.keys())[list(d.values()).index(max(b))]
print(a,'出现的次数最多,总共出现了',max(b),'次')
"""
也可以把你a中的每一个元素作为key放到字典中,把key出现的次数作为value与前面的key对应起来,然后写一个方法,找key
"""
a = [5,5,1,6,4,6,4,6,6,5,4,3,3,5,4,5,4,6,6,6,5,6,5,5,6]
b = []
d = {}
for i in a:
j = a.count(i)
d[i]=j
b.append(j)
def get_key(x,val):
for k,v in x.items():
if v == val:
return k
print(get_key(d,max(b)),'出现的次数最多,总共出现了',max(b),'次')
"""
或者也可以把遍历字典的方法写的而简单点
"""
a = [5,5,1,6,4,6,4,6,6,5,4,3,3,5,4,5,4,6,6,6,5,6,5,5,6]
b = []
d = {}
for i in a:
j = a.count(i)
d[i]=j
b.append(j)
def get_key(x,val):
return [k for k,v in x.items() if val ==v]
print(get_key(d,max(b)),'出现的次数最多,总共出现了',max(b),'次')
# 这三种方式都可以得到正确的结果
题目9:创建一个 88 x 88 的随机整数矩阵(二维列表),然后匹配用户输入的整数是否与其中某元素相等,如果相等则打印其行号和列号
需求分析:
1、要求1:随机整数取值范围 0~1024
2、要求2:需找出所有匹配的元素
思路:
1、需要用到random
2、两层循环创建二维列表
3、匹配输入值:
答案:
import random
matrix = []
for i in range(88):
matrix.append([]) # 外层循环加上一个空列表
for j in range(88):
matrix[i].append(random.randint(0,1024)) # 内层循环时往空的子列表中append随机数,循环88次 之后外循环再给一个空列表,内层循环随即在往空的子列表中append随机数
target = int(input("请输入一个目标整数:"))
is_find = 1
for i in range(len(matrix)):
for j in range(len(matrix)):
if target == matrix[i][j]:
print(i,j)
is_find = 0
if is_find == 1:
print("没找到目标数值。")
题目10:请编程找出矩阵中的幸运数字。
需求分析:
1、某一个元素的值在同一行的所有元素中最小,并且在同一列的所有元素中最大,那么该元素便是幸运数字。
2、矩阵中数值的取值范围是 0~1024,且各不相同
思路:
1、先用两层循环创建一个列表矩阵(二维列表)
2、用len(matrix)
表示行数
3、用len(matrix[0])
表示列数
4、遍历矩阵,找到每行最小的数和每列最大的数
5、最小的数等于最大的数时,打印出来此时的元素
答案
matrix = [[10, 36, 52],
[33, 24, 88],
[66, 76, 99]]
row = len(matrix)
col = len(matrix[0])
min_row = [1024] * row
max_col = [0] * col
# 遍历矩阵中的每一个元素
# 找到每行中最小的元素,并将它们存放到列表min_row中
# 找到每列中最大的元素,并将它们存放到列表max_col中
for i in range(row):
for j in range(col):
min_row[i] = min(matrix[i][j], min_row[i])
max_col[j] = max(matrix[i][j], max_col[j])
# 遍历矩阵中的每一个元素
# 判断是否同时满足“同一行的所有元素中最小”和“同一列的所有元素中最大”
for i in range(row):
for j in range(col):
if matrix[i][j] == min_row[i] and matrix[i][j] == max_col[j]:
print(matrix[i][j])
题目11:请将下面 matrix 矩阵反向展开
需求分析:
1、展开二维列表
2、倒序
思路:
1、两层循环
2、倒序
答案:
"""
迭代写法:
"""
matrix = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
lista = []
for i in matrix:
for j in i:
lista.append(j)
lista.sort(reverse=True)
print(lista)
"""推导式写法"""
result = [j for i in matrix for j in i][::-1]
题目12:请使用列表推导式,获得 matrix 矩阵的转置矩阵 Tmatrix(将 matrix 的行列互换之后得到的矩阵,称为 matrix 的转置矩阵)。
需求分析:
1、转置之后原列表的行数等于新列表每一行的长度
2、原列表每一个行的长度等于新列表的行数
思路:
1、len(matrix) = len(Tmatrix[])
2、len(matrix) = len(Tmatrix)
答案:
"""列表推导式解法"""
""""""
matrix = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]]
Tmatrix = [[matrix[i][j] for i in range(len(matrix))] for j in range(len(matrix[0]))]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
"""迭代解法"""
matrix = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]]
Tmatrix = []
for i in range(len(matrix[0])):
Tmatrix.append([])
for j in range(len(matrix)):
Tmatrix[i].append(matrix[j][i])
print(Tmatrix)
题目13:用户输入两个版本号 v1 和 v2,请编写代码比较它们,找出较新的版本。
需求分析:
1、版本号是由一个或多个修订号组成,各个修订号之间由点号(.)连接,每个修订号由多位数字组成,例如 1.2.33 和 0.0.11 都是有效的版本号。
2、从左到右的顺序依次比较它们的修订号,点号(.)左侧的值要比右侧的权重大,即 0.1 要比 0.0.99 大。
思路:
1、用split进行拆分
2、将两个版本号组装到一起
3、对组装后的迭代器进行遍历
答案:
"""fillvalue可以制定一个数字去补足两个版本号较少的那一个,这里用数字0来补足"""
from itertools import zip_longest
def comp(a,b):
for i, j in zip_longest(a.split('.'), b.split('.'), fillvalue=0):
if int(i) == int(j):
# print("相等")
continue
if int(i) < int(j):
# print("V2")
return "V2"
else:
return "V1"
return "相等"
a = input("请输入第一个版本号,V1: ")
b = input("请输入第二个版本号,V2: ")
print(comp(a,b))
题目14:编写一个加密程序,其实现原理是通过替换指定的字符进行加密,附加要求是实现密文逆向检测。
需求分析:
通过上面输出结果可以看出要求有以下几点:
1、需要替换的和将要替换的,长度必须一致,否则不会打印密文
2、如果需要替换的和将要替换的出现了重复的元素,可以打印密文,但会告诉用户无法解密
思路:
1、使用str.makrtrans
可以替换指定的字符
2、使用使用translate
可以翻译成转化后的字符
答案:
a = input("请输入需要加密的明文:")
b = input("请输入需要替换的字符:")
c = input("请输入将要替换的字符:")
if len(b) != len(c):
print("需要替换的字符数量必须跟将要替换的字符数量一致。")
else:
print("加密后的密文是:",a.translate(str.maketrans(b, c)))
if len(set(b)) != len(b) or len(set(c)) != len(c):
print("由于替换字符出现重复,该密文无法解密")
题目15:检测列表中的元素是否是回文数,并返回一个由回文数组成的新列表
需求分析:
回文数就是正反读都是一样的数字
通过上面输出结果可以看出要求有以下几点:
1、找到回文数
2、输出新的列表
思路:
1、使用反转字符串
可以判断回文数
2、使用append()
可以生成列表
答案1:
循环写法
a = ["123", "33211", "12321", "13531", "112233"]
b = []
for i in a:
if i == i[::-1]:
b.append(i)
else:
continue
print(b)
答案2:
列表推导式写法
a = ["123", "33211", "12321", "13531", "112233"]
[i for i in a if i == i[::-1]]