1 打表找规律
1.1
暴力方法很方便
就是把数据打印出来找规律
# 打表找规律
def minBagBase(rest):
if rest % 6 == 0:
rest = rest / 6
else:
rest = -1
def minBagAwesome(apple):
if apple & 1 != 0: # 如果是奇数,返回1
return -1
if apple < 18:
if apple == 0:
return 0
else:
if apple == 6 or apple == 8:
temp = 1
else:
return (apple - 18)/ 8 + 3
def minBages(apple)
if apple < 0:
return -1
bag6 = -1
bag8 = apple / 8
rest = apple - 8 * bag8
while bag8 >= 0 and rest < 24:
restUse6 = minBagBase(rest)
if restUse6 != -1:
bag6 = restUse6
break
bag8 = bag8 - 1
rest = apple - 8 * bag8
if bag6 == -1:
bag6 = -1
else:
bag6 = bag6 + bag8
return bag6
for apple in range(1,101):
print(apple + ":" + minBages(apple)) # 全部打印出来看看有什么规律
1.2 吃草问题
先别想数学规律,先打印出来看一看,写一下这个尝试
# n份草放在一堆
# string 先手 后手
# 先暴力出来
def winner1(n): # 先手先选
# 0 1 2 3 4
# 后赢 先 后 先 先
if n < 5: # 先把前面无规律的基本数据列出来
if n == 0 or n == 2:
return "后手"
else:
return "先手"
# n >= 5
base = 1 # 当前先手确定吃的草数
# 当前是先手在选
# while 先手试吃 4 16 64 份情况
while base <= n:
if winner1(n - base) == "后手":
return "先手"
if base > n/4: # 防止base*4之后溢出
break
base = base * 4
return "后手" # 先手尝试多种吃法,都赢不了,所有就后手赢了
# 打印出来后就看见规律了,用看见的规律写如下代码
for i in range(0,51):
print(winner1(i))
def winner2(n):
if n % 5 == 0 or n % 5 == 2:
return "后手"
else:
return "先手"
1.3 连续正数和
先暴力输出,找规律,再去优化
def isMSum1(num):
for i in range(1,num + 1):
sum = i # 开头的数是i......一直加
for j in range(i + 1,num + 1):
if sum + j > num:
break
if sum + j == num:
return True
sum = sum + j
return False
# 暴力完,输出看看
for num in range(1,200):
print(str(num) + ":"+ str(isMSum1(num)))
# print("test begin")
# for num in range(1,5000):
# if isMSum1(num) != isMSum2(num):
# print("oops")
# print("test end")
# 优化
def isMSum2(num):
if num < 3:
return False
return num & (num - 1) != 0 # num的num-1 次幂
2 矩阵处理
2.1 斜线打印
def printMatrixZigZag(matrix):
Ar = 0 # A的行号
Ac = 0 # A的列号
Br = 0 # B的行号
Bc = 0 # B的列号
Endr = len(matrix) - 1 # 终止位置的行
Endc = len(matrix[0]) - 1 # 终止位置的列
fromUp = False # 是不是从右上往左下打印,打印方向
while Ar != Endr + 1: # Ar不要到终止条件的下一行
# 得知斜线的两端,A和B,打印方向也给出
printLevel(matrix,Ar,Ac,Br,Bc,fromUp)
# A先向右走,到最右边再往下
if Ac == Endr:
Ar = Ar + 1
if Ac != Endc:
Ac = Ac + 1
if Br == Endr:
Bc = Bc + 1
if Br != Endr:
Br = Br + 1
fromUp = not fromUp
print()
def printLevel(m,tR,tC,dR,dC,f):
if f:
while tR != dR + 1:
print(str(m[tR][tC]) + " ")
tR = tR + 1
tC = tC - 1
else:
while dR != tR - 1:
print(m[dR][dC] + " ")
dR = dR - 1
dC = dC + 1
2.2 按圈打印
rotateEdge函数
# 矩阵问题 == 边界问题
def rotate(matrix):
a = 0
b = 0
c = len(matrix) - 1
d = len(matrix[0])
while a < c: # 因为是正方形,所以只用判断行不越界即可
a += 1
b += 1
c -= 1
d -= 1
rotateEdge(matrix,a,b,c,d) # 每一次左上角点和右下角点规定一个框,怎么运动,左上角点向右下运动,右下向左上运动
def rotateEdge(m,a,b,c,d):
tmp = 0
for i in range(0,d - b): # 组的编号
tmp = m[a][b + i]
m[a][b + i] = m[c - i][b]
m[c - i][b] = m[c][d - i]
m[c][d - i] = m[a + i][d]
m[a + i][d] = tmp