腾讯笔试

1 输入只含小括号和中括号的序列,输出至少加入多少括号可以将此序列合法。

空序列自然合法
[])
输出1
( ] ) ] (])] (])]
输出2
方式为([])[]
而其实还有其它的方式:()[]
但是这样的话,就得加入4个。

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""
def f(s,n):
    if not len(s):
        return n
    else:
        while len(s) and (s[-1] == "(" or s[-1] == "["):
            n += 1
            s.pop()

        while len(s) and (s[0] == ")" or s[0] == "]"):
            n += 1
            s.pop(0)
        ic=0
        for i in range(1,len(s)):
                ic=i
                if s[i]==d1[s[0]]:
                        break
        i=ic
        if i==len(s)-1 and s[-1]!=d1[s[0]]:#未匹配到
            n+=1
            n=f(s[1:],n)
        else:
            n=f(s[1:i],n)
            n=f(s[i+1:],n)
        return n

s = list(input())
n = 0
d = ["()", "[]"]
d1={"(":")","[":"]"}
print(f(s,n))

 





这是典型的分治方法。复杂度为O(n^2),尚有改进的空间,因为可能重复遍历。

求一个积分的值

没啥说的

输入n,从n个人中任意选人,再从选出的人任意选出一个人作为队长,求种数

其实就是 Σ i = 0 n i C n i = n 2 n 2 \Sigma_{i=0}^niC_n^i=\frac{n2^n}{2} Σi=0niCni=2n2n

一个无向图的价值定义为,若g(x)=g(y)则价值加1,x≠y,g(x)为x邻边的集合。

这个就是比较邻接矩阵而两行是否相同,蛮力复杂度为O(V^2)。
用邻接表的话为O(VE)。改进的方向为x和y必然无邻接关系。可以少一些计算量。

一个有向图,有k个传送门,传送门为单向,可直接从一个顶点到达另一个顶点,此间不计距离,宝物在一个顶点处,求从另一个顶点到宝物的最小距离,若不能到达宝物处则返回-1.

其实还是dijkstra的应用,只不过这里如果存在传送门,则边的权值为0,如果最后返回还是正无穷,则不能到达。、

算法的主定理

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值