华为5.24笔试题

1.连续空间内存合并管理。

思路:对数组进行排序,寻找最大的整数区间的左端点和区间长度。

def func():
    memory_list = map(int, input().strip().split(','))
    memory_list = list(set(memory_list))


    memory_list.sort()

    max_start = memory_list[0]
    max_length = 1

    start = memory_list[0]
    length = 1
    for i in range(1, len(memory_list)):
        if memory_list[i] == start+length:
            length += 1
        else:
            if length>max_length:
                max_start = start
                max_length = length
            start = memory_list[i]
            length = 1

    if length>max_length:
        max_start = start
        max_length = length
	print('{},{}'.format(max_start, max_length))

2.海量日志抑制

思路:

(1)定义一个长度为10的缓存区间

(2)一个辅助函数(判断相似日志)

(3)判断2ms内的连续2个日志的相同性

(4)判断10ms内的连续10个日志的相似性

from collections import deque
def func():
    # 定义一个缓存,用于存储最近的日志信息,因为是要看前10条信息,故缓存长度为10
    log_cache = deque(maxlen=10)
    # 定义一个函数,用于判断两条日志是否相似

    def is_similarity(log1, log2):
        return ''.join(filter(lambda x: not x.isdigit(), log1)) == ''.join(filter(lambda x: not x.isdigit(), log2))

    n = int(input())
    for i in range(n):
        log = input().strip()
        timestamp, content = log.split(':', 1)
        timestamp = int(timestamp)
        if len(log_cache) >= 1 and timestamp-log_cache[-1][0]<10 and content == log_cache[-1][1]:
            # 10ms内打印相同的日志,只保留第一条日志
            continue
        elif len(log_cache) >= 9 and timestamp -log_cache[0][0]<100 and is_similarity(content, log_cache[0][1]):
            # 100ms内打印相似的日志,仅保留前9条
            continue
        else:
            print(log)
            log_cache.append((timestamp, content))

3.网络升级改造

思路:1.就是leetcode上的337.打家劫舍3

2.直接把数组转换为二叉树。

3.直接按照337.打家劫舍3的思路进行

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None


def build_tree():
    n = int(input())

    nums = map(int, input().split())

    nums = list(nums)

    if not nums:
        return None
    root = TreeNode(nums[0])
    queue = [root]

    i = 1
    while i < len(nums):
        node = queue.pop(0)

        if nums[i] is not None:
            node.left = TreeNode(nums[i])
            queue.append(node.left)
        i += 1
        if i >= len(nums):
            break

        if nums[i] is not None:
            node.right = TreeNode(nums[i])
            queue.append(node.right)
        i += 1
    return root


def rob(root):
    dp = trasversal(root)
    print(max(dp))


def trasversal(node):
    if not node:
        return (0, 0)

    left = trasversal(node.left)
    right = trasversal(node.right)

    val_0 = max(left[0], left[1]) + max(right[0], right[1])

    val_1 = node.val + left[0] + right[0]

    return (val_0, val_1)


def func():
    root = build_tree()
    rob(root)

全部评论
老哥全A了吗
1 回复 分享
发布于 2023-05-24 21:29 广东
谢谢老哥,我都是通过了一部分
点赞 回复 分享
发布于 2023-05-25 08:28 北京

相关推荐

11-15 19:28
已编辑
蚌埠坦克学院 硬件开发
点赞 评论 收藏
分享
7 19 评论
分享
牛客网
牛客企业服务