1.求表面积
思路:顶部和底部不会被遮挡,且当v = grid[i][j] > 0,有且只有2个面。四周东南西北,取决于grid[i][j]的个数,再减去上下左右遮挡它的个数(注意最小为0,不能加上负数)
def surfaceArea(grid):
# 顶部和底部不会被遮挡,且当v = grid[i][j] > 0,有且只有2个面
# 四周东南西北,取决于grid[i][j]的个数,再减去上下左右遮挡它的个数
res = 0
# 行
n = len(grid)
# 列
m = len(grid[0])
for i in range(n):
for j in range(m):
if grid[i][j] > 0:
res += 2
for r, c in ((i - 1, j), (i, j - 1), (i + 1, j), (i, j + 1)):
if 0 <= r < n and 0 <= c < m:
# 四周其中一个方向,需要扣除周围遮挡的个数
# grid[i][j] - grid[r][c] 可能为负值
res += max(grid[i][j] - grid[r][c], 0)
else:
res += grid[i][j]
return res
print(surfaceArea([[2,1],[1,1]]))
2.两个数字,m进制,n位数,可以重新排序数字的顺序,两个数对应相加并对m取模而不进位,求最大和
思路:例如m=5,最大数字分别为4,3,2,1,0,两个数字为[4,4,1,1,1],[4,3,0,1,2]
1)首先构造4,求出第一个数[4,4,1,1,1]的对应数放入数组 count_0 ,即为[0,0,3,3,3], count_1 = [4,3,0,1,2],找这两个数组的重合数字为0,3
因而递归两个数字变成了[4,1,1],[4,1,2])
2)构造3,求出第一个数[4,1,1]的对应数放入数组 count_0 ,即为[4,2,2],这个地方有个技巧,需判断元素是否大于3, count_1 = [4,1,2],找这两个数组的重合数字为4,2
因而递归两个数字变成了[1],[1]
3)构造2,1+1 = 2,此时递归两个数字变成了[],[]
结束递归,条件为长度为0
# -*- coding:utf-8 -*-
import copy
# m进制
m = 5
n = 5
final = []
def build(line, num):
res = []
# 第一个数的对应数组
count_0 = []
# 第二个数直接复制
count_1 = copy.deepcopy(line[1])
# 递归终止条件
if len(count_1) == 0:
return []
for i in range(len(line[1])):
# 需判断元素是否大于num
if line[0][i] <= num:
# 直接相加的值
count_0.append(num - line[0][i])
else:
# 相加之后-模运算的值
count_0.append(m + num - line[0][i])
# print([count_0, count_1])
for i in range(len(line[1])):
# 查询数组里面相同的数字,找到之后赋值为-1
if count_1[i] in count_0:
res.append(num)
count_0[i] = -1
count_1[i] = -1
# 返回已经删减相同元素的原数组
count_0 = [line[0][i] for i in range(len(count_0)) if count_0[i] != -1]
count_1 = [line[1][i] for i in range(len(count_1)) if count_1[i] != -1]
assert len(count_0) == len(count_1)
# 递归
return res + build([count_0, count_1], num - 1)
a = [[4,4,1,1,1],[4,3,0,1,2]]
print(build(a, m-1))