导文
算法习题不在于多,而在于思想的精髓
求杨慧三角的第m行第K个元素
- 第m行有m项,m是正整数,因此k一定不会大于m
- 第n行的m个数可表示为C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合
题目考点
1.组合数计算公式,C(n,m)=n!/((n-m)!*m!)
2.算法优化在计算n!的阶乘时,其实n-m的阶乘和m的阶乘都已经计算过了,因此无需再浪费时间再次计算
3.存取数据无需定义太多变量,若变量超过2个则采用列表容器进行装置
示范代码:
#!/bin/python3
#-*- coding: UTF-8 -*-
n = int(input("input your n row: "))
m = int(input("input your m col: "))
#要注意给变量起名字
reslst = []
factsum = 1
for i in range(1,n):
factsum *= i
if i == m-1:
reslst.append(factsum)
if i == n-m:
reslst.append(factsum)
reslst.append(factsum)
print("The number {}row {}col is {}".format(n,m,reslst[2]//(reslst[1]*reslst[0])))
运行结果:
input your n row: 5
input your m col: 3
The number 5row 3col is 6
给定一个矩阵,求其转置矩阵
考点
1.语法糖一次性开辟要求列表格式
2.利用枚举原理,锁定新列表的索引和索引所对应的值,第一轮的循环,能确定新列表每个元素内嵌套元素的索引位置及新列表所有元素中的索引为0的元素。
3.考点就是枚举的原理和使用,下面通过两种方式进行实现,但原理不变
4.尽可能的不要使用列表的添加,尽可能的一次性生成目标列表
#!/bin/python3
#-*- coding: UTF-8 -*-
lst = [[1,2,3],[4,5,6]]
lis = []
#矩阵方法一 随着使用添加空列表
for i,row in enumerate(lst):
for j,col in enumerate(row):
if len(lis) < j+1:
lis.append([])
lis[j].append(col)
print(lis)
#矩阵方法二 一次性生成目标列表
lsi = [[0 for x in range(len(lst))] for x in range(len(lst[0]))]
for i,row in enumerate(lst):
for j,col in enumerate(row):
lsi[j][i] = col
print(lsi)
随机产生10个数字
- 每个数字取值范围[1,20]
- 统计重复的数字有几个?分别是什么?
- 统计不重复的数字有几个?分别是什么?
考点
遇到列表采用语法糖格式写法,加速优化代码
第一遍通常是写出代码
第二遍通常是代码优化,如果能一次循环完成则一次完成,如果一次循环完成后,第二次循环再进入循环时,考虑是否有些东西无需比对
代码示范:
#!/bin/python3
#-*- coding: UTF-8 -*-
import random
numlst = [random.randint(1,20) for i in range(10)]
samelst = []
difflst = []
states = [0]*10 #记录标记状态是否已经比对过
for i in range(len(numlst)):
flag = False
if states[i] == 1:
continue
for j in range(i+1,len(numlst)):
if states[j] == 1:
continue
if numlst[i] == numlst[j]:
states[j] = 1
#做优化,如果已经判断已经相等,下次就没有必要再和这个数比较
flag = True
samelst.append(numlst[i]) if flag else difflst.append(numlst[i])
print("The same number is {}".format(samelst))
print("The different number is {}".format(difflst))
print("The number list is {}".format(numlst))