2019年9月4日

携程笔试题目

车辆时刻表分组

双指针python

s = 'abacbc'
i =0
res =[]
dic = dict(zip(s,[i for i in range(len(s))]))

p1 = 0
while p1<len(s):
    temp = s[p1]
    start = p1
    p2 = dic[s[p1]]
    while p1 != p2:
        for j in range(p1,p2):
            if s[j]!= temp:
                p2 = max(p2,dic[s[j]])
                p1 += 1
                break
            p1 += 1
    res.append(p2-start+1)
    p1 = p1+1

print(','.join([str(i) for i in res]))
复制代码

计算AUC

def AUC(label, pred):

    pos = [i for i in range(len(label)) if label[i] == 1]
    neg = [i for i in range(len(label)) if label[i] == 0]
 
    auc = 0
    for i in pos:
        for j in neg:
            if pred[i] > pred[j]:
                auc += 1
            elif pred[i] == pred[j]:
                auc += 0.5
 
    return auc / (len(pos)*len(neg))

if __name__ == "__main__":
    n = int(input())
    label = []
    pred = []
    for i in range(n):
        a1,a2 = list(map(float,input().split()))
        label.append(a1)
        pred.append(a2)
    print("{:.2}".format(AUC(label,pred)))

复制代码

重复子串模式,使用KMP

if __name__ == "__main__":
    import sys
try:
    while True:
        line = sys.stdin.readline().strip()
        if line == '':
            break

        n = len(line)
        next = [0]*(len(line)+1)
        next[0] = -1
        j = 0
        k = -1

        while j< len(line):
            if k==-1 or line[k] == line[j]:
                k +=1
                j +=1
                next[j] =k
            else:
                k = next[k]
        if next[n] and n % (n-next[n])==0:
            print("True")
        else:
            print("False")
except:
    pass
复制代码

度小满面试题目

单向链表是否相交

# 给定两条单向链表A,B. 求这两条链表是否相交, 若相交, 给出公共节点

class Node:
    def __init__(val, next):
        self.val = val
        self.next = next
        
 
def find(A:Node, B:Node):

    if A and B:
        return None
    
    Ahead = A
    Bhead = B
    
    temp_set = set()
    
    res = []
    
    while Ahead and Bhead:
    
        if Ahead in temp_set:
            res.append(Ahead)
        else:
            temp_set.add(Ahead)
            Ahead = Ahead.next
            
        if Bhead in temp_set:
            res.append(Bhead)
        else:
            temp_set.add(Bhead)
            Bhead = Bhead.next
            
    if res==[]:
        return None
    else:
        return res
复制代码

手写KNN,假设距离函数已经给定

import numpy as np
from collections import Counter

class knn:

    def __init__(k):
        self.k = k
        
    def pred(data, label, test):
        dislist = [dis(test,i)for i in data][:k]
        c = Counter(dislist)
        return c.most_comment()
复制代码

美团面试代码题目

单链表快速排序

复制代码

蘑菇街

字符串最长公共子串

复制代码