360笔试——2019.08.15

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_18310041/article/details/99656445

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))

猜你喜欢

转载自blog.csdn.net/qq_18310041/article/details/99656445