校招-腾讯技术研究一面面经

1、时间2018年8月29日 上午十点半

2、部门:TEG,语言偏向c++,python也能接受

3、面试流程:

1)自我介绍

2)写代码:一共三题

a、

输入:两个区间,区间是左闭右开的

输出:这两个区间是否有交集

示例: 输入 [3,5) [6,11) 输出 false

输入 [3,5) [4,11) 输出true

写一个函数,可以用任何语言,自行组织输入结构

思路:首先取两个集合左边最小的集合a,然后比较集合b左边和集合a右边有没有交集

#sub1 list [a,b] sub2 list[a1,b1]
def getMinStart(sub1,sub2):
    if sub1[0]<=sub2[0]:
        return sub1,sub2
    else:
        return sub2,sub1
def sameTheSub(sub1,sub2):
    if len(sub1)!=2 or len(sub2)!=2:
        return false
    sub1,sub2=getMinStart(sub1,sub2)
    if sub1[1]<=sub2[0]:
        return false
    elif sub1[1]>sub2[0]:
        return true

b、

输入:一个数组 a,a中每个元素都是一个区间,左闭右开

输入:一个区间b

输出:把区间b插入到数组 a中,输出插入以后的新数组

a中的区间是从小到大排好序的,且两两之间无交集

要求输出的数组也是有序且两两之间无交集的

如果b与a中任意元素有交集,则无法插入,则输出原始数组

例外是:如果b可以完全覆盖a中的某些元素,则把被覆盖的元素删掉,再把b插入进去

示例:输入 a = [3,5) [6,9) [15,18) b = [10,12)

输出 [3,5) [6,9) [10,12) [15,18)

思路:首先判断b是否与a的某个元素有交集,及与a有交集的数量,交集大于1则直接返回,等于1,则判断是否覆盖,等于0,则判断b应该插入的位置

def insertSet(a,b):
    #异常情况
    if len(a)==0:
        return b
    if len(b)!=2:
        return a
    indexList=[]
    count=0
    firstIndex=-1
    for i in range(len(a)):
        if firstIndex==-1 and a[i][0]>b[0]:
            firstIndex=i
        if sameTheSub(a[i],b):
            count+=1
            indexList.append(i)
        if count>1:
            pass
        elif count==1:
            if b[0]<=a[indexList[0]][0] and b[1]>= a[indexList[0]][1]:
                a[indexList[0]]=b
            else:
                    pass
        elif count==0:
            if firstIndex==-1:
                #判断应该插入头部还是尾部
                if (a[0][0]<b[0]):
                    a.append(b)
                else:
                    a.insert(0,b)
            else:
                a.insert(firstIndex,b)
    return a

后来经面试官提示,少考虑一个情况,如果交集有多个的话,判断是够覆盖多个元素的情况。

c、

归并排序

输入:a,b两个有序数组

输出:有序数组,重复元素剔除

思路:简单的归并的一个题目,需要注意的是a、b可能原先就存在重复的情况。

def mergeWithDumplicate(a,b):
    c=[]
    if len(a)==0 and len(b)==0:
        return c
    elif len(a)==0 or len(b)==0:
        noEmpty=None
        if len(a)!=0:
            noEmpty=a
        else:
            noEmpty=b
        c.append(noEmpty[0])
        for i in range(1,len(noEmpty)):
            if noEmpty[i]!=c[len(c)-1]:
                c.append(noEmpty[i])
    else:
        i,j=0,0
        if a[0]<=b[0]:
            i=1
            c.append(a[0])
        else:
            j=1
            c.append(b[0])
        while(i<len(a) and j<len(b)):
            if a[i]<=b[j]:
                i+=1
                if a[i]!=c[len(c)-1]:
                    c.append(a[i])              
            else:
                j+=1
                if b[j]!=c[len(c)-1]:
                    c.append(b[j])
        remain=[] 
        if i<len(a):
            remain=a
        if j<len(b):
            remain=b
        for i in range(0,len(remain)):
            if remain[i]!=c[len(c)-1]:
                c.append(remain[i])
    return c

3、问项目

主要询问了融360实习的中介挖掘的思路,百度的短文本分类的等项目,然后给了场景题,10w的文本,4000个类别,有什么好的方法解决分类问题。

4、问问题

问了面试官一些问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值