模拟linux 内核任务 (京东笔试题)

京东算法笔试题 模拟linux 内核任务 (2021-9-12)

两个字典

"""
题目:当服务 a 引入了服务 b作为依赖之后,服务 a 启动时 b 会随之启动,b 停止时 a 会随之停止。给你 n 个服务和它们之间的依赖关系,一开始所有服务都处于停止状态,然后进行若干次启动和停止操作,
    你需要在每一次操作后输出当前正在运行的服务数量。假设所有服务都能稳定运行、正常启动和退出。为了简化输入,所有服务名使用序号(1~n)代替。可
    ps:以启动正在运行的程序,也可以停止已经停止的程序,这样的操作将不会造成任何变化。
    输入:
        3 2 第一行两个空格隔开的整数 n, q,表示服务的数量和询问的数量,1 <= n, q <= 500。
        1 2 下面 n 行,其中的第 i 行第一个整数 c 表示第 i 个服务所依赖的服务数量,后面 c 个整数表示它所依赖的各个服务,保证这 c 个整数在 1~n 范围内,互不相等且都不等于 i。
        1 3
        0
        1 1 下面 q 行,每行两个空格隔开的整数 x, y。x 为 1 或 0,1 表示启动服务,0 表示停止服务。y 表示启动或停止的服务的序号。
        0 2

    输出  3
         1

分析:
    建立start字典 和  quit字典
    start字典:key代表服务   value代表该服务的依赖 以及 依赖的祖先依赖
    quit字典: key代表依赖  value代表所有依赖key的服务


    我的复杂一点的例子(仅有服务信息):
            5 2
            2 2 3
            1 4
            1 4
            1 5
            0
    对应所建字典:
        输入记录{1: [2, 3], 2: [4], 3: [4], 4: [5]}
        START {1: [2, 3, 4, 5], 2: [4, 5], 3: [4, 5], 4: [5]}
        quit {2: [1], 3: [1], 4: [1, 2, 3], 5: [1, 2, 3, 4]}

    设置一个数组为服务状态,根据动作信息更改状态

"""
def calRelys(service, i):
    if service not in start:
        return
    layerRelys = start[service]

    if service != i:
        start[i].extend(layerRelys)
    for rely in layerRelys:
        calRelys(rely, i)


# 输入
lines = input().strip().split(' ')
n, q = int(lines[0]), int(lines[1])
# {1: [2, 3], 2: [4], 3: [4], 4: [5]}
start, quit = {}, {}
for i in range(1, n + 1):
    lines = list(map(int, input().strip().split()))
    if lines[0] != 0:
        start[i] = lines[1:]
# 记录动作
acts = []
for i in range(q):
    act = list(map(int, input().strip().split()))
    acts.append(act)
# print(start)

# 建立START字典
for i in range(1, n+1):
    if i in start:
        calRelys(i, i)
for star in start:
    start[star] = list(set(start[star]))

# 建立quit字典
for item in start:
    templist = start[item]
    for x in templist:
        if x not in quit:
            quit[x] = [item]
        else:
            quit[x].append(item)
# print(start)
# print(quit)

# 根据输入更改状态
state = [0]*(n+1)

for act in acts:
    # 启动
    if act[0] == 1:
        state[act[1]] = 1
        sts = start[act[1]]
        for x in sts:
            state[x] = 1
    # 停止
    else:
        state[act[1]] = 0
        sts = quit[act[1]]
        for x in sts:
            state[x] = 0
    print(sum(state))

路虽远,行则将至。事虽难,做则必成 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值