欢聚时代 2019.9.9推荐算法的笔试题 两道基础题


补充了第一题的题解,
第一题在评论的提示下写出来了,感谢,放在最后面了



原回答:
######
哦吼,今天的卷子几乎没改又出了一次,棒啊


原回答:
头疼啊,前两题,一道10分
1、有三个list,存着int数据,每个长度n,然后找到最大的topk三元组,三元组的大小按三个数的和计算,一个list一个。。n=1024,k=128
不会做。。
2、100亿数组,数据的值是一个key64位,两个float,现在找到一个合适的数据结构把他们存起来,O(1)时间,数据值不改,提示是只读hash。
写的一致性哈希环,胡言乱语。。。
不会做。
卡了很长时间这俩题目,最后几乎白卷,求助求助求助
六道机器学习题都很简单了。顺序忘了,一小时高强度打字,一道20分
1、梯度爆炸和消失的原因 解决办法
2、过拟合原因 解决办法 实际中你怎么判断过拟合
3、常用的优化方法 优缺点 有没有最好的优化方法
4、ReLU激活函数 优缺点 坑在哪里
5、短视频,推荐多样性,给你用户静态数据,历史推荐和历史行为,视频的类型、时间等 量化推荐的多样性 改进推荐
6、新视频冷启动,策略和工程实现
######



#建堆,可以直接优先队列,不太熟悉python的优先队列库
def heap_step(data,index):
    #index的左右结点不空
    l = index*2+1
    r = index*2+2
    cur = index
    if l<len(data) and data[cur]>data[l]:
        cur=l
    if r<len(data) and data[cur]>data[r]:
        cur=r
    if index!=cur:
        data[index],data[cur]=data[cur],data[index]
        heap_step(data,cur)
    return None     
def mak_heap(data0):
    data = data0[:]
    index_max=len(data)//2
    for index in range(index_max,-1,-1):
        heap_step(data,index)
    return data
def heap_updata_K(data,value):
    #模仿优先队列的插入操作
    if value<=data[0]:
        return
    else:
        data.append(data[0])
        data[0] = value
        data.pop()
        k = len(data)-1
        heap_step(data,0)
#
#data = [1,2,3,4,5,6]
#mak_heap(data)
#
#数据
data_all = [[1,2,3,4,5,6,7,8,9,10,11,12],[2,2,3,0,1,6,0,1,6,0,1,6],[0,1,6,0,1,6,0,1,6,8,7,6]]
#两个列表找最大和topK
#由于是最大的topK,排序记得reverse
def get_he(data1,data2):
    x = sorted(data1,reverse = True)
    y = sorted(data2,reverse = True)
    pri_quequ = mak_heap([i+x[0] for i in y])
    for y_index in range(0,len(y)):
        if y[y_index]+x[0]<=pri_quequ[0]:
            break
            #剪枝,很重要,复杂度立马降下来了
        else:
            for x_index in range(1,len(x)):
                heap_updata_K(pri_quequ,value=y[y_index]+x[x_index])
    return sorted(pri_quequ)
#矩阵找最大行和topK,重复两行的调用就可以了
def get_all_he(data):
    data1 = data[0][:]
    for i in range(1,len(data)):
        data1 = get_he(data1,data[i][:])
    return sorted(data1,reverse=True)
def get_all_min_he(data):
    for i in range(len(data)):
        for j in range(len(data[0])):
            data[i][j]=-data[i][j]
    tmp = get_all_he(data)
    res = [-i for i in tmp]
    #还原回来,虽然没必要
    for i in range(len(data)):
        for j in range(len(data[0])):
            data[i][j]=-data[i][j]
    #
    return res
print(get_all_he(data_all))
print(get_all_min_he(data_all))
输出情况
[26, 26, 26, 25, 25, 25, 25, 25, 25, 24, 24, 24]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2]
暴力检查
tmp = []
for i in range(len(data_all[0])):
    for j in range(len(data_all[1])):
        for k in range(len(data_all[2])):
            tmp.append(data_all[0][i]+data_all[1][j]+data_all[2][k])
tmp.sort()
print(tmp[:len(data_all[0])])
print(tmp[-len(data_all[0]):][::-1])
暴力输出
[1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2]
[26, 26, 26, 25, 25, 25, 25, 25, 25, 24, 24, 24]

#笔经##笔试题目##欢聚集团##秋招#
全部评论
蹲个解答
点赞 回复 分享
发布于 2019-09-09 20:56
大佬们,想问一下,为什么我的输入输出都没问题,但是case通过一直是0;就是将输入的String放进char数组里面,然后从最后一位开始循环比较跟前面的值的大小,遇到第一个比后面的值小的,就换位,但是一直通不过,不知道为什么。 package interview; import java.util.Scanner; public class Yy {    public static void main(String[] args) {         Scanner sc = new Scanner(System.in);          String st = new String();          st = sc.next();         char[] num = new char[st.length()/2 + 1];         char bigger;         for(int i = 0,j = 0;i < st.length()/2 + 1;i ++) {          num[i] = st.charAt(j);          j +=2;         }        int mark = 0;         for(int j = st.length()/2;j >= 0;j --) {         bigger = num[j];         for(int i = j;i >= 0 ;i --) {          if(num[i] < bigger) {          num[j] = num[i];          num[i] = bigger;          mark = 1;          break;          }         }         if(mark == 1) break;         }                  if(mark == 0) {          for(int i = st.length()/2;i >= 0;i --) {          System.out.print(num[i]);          if(i != 0) System.out.print(",");          }         }         else{           for(int i = 0;i < st.length()/2 + 1;i ++) {          System.out.print(num[i]);                   if(i != st.length()/2) System.out.print(",");                   }         }     } }
点赞 回复 分享
发布于 2019-09-09 21:35
第一题我觉得可以用priorityqueue解决,第二题用hashmap value上放一个pair 不知道这样弄可不可以。我就这样大概写了一下
点赞 回复 分享
发布于 2019-09-10 03:29
老哥,请教推荐算法怎么学习?有哪些资料可以推荐一波吗?
点赞 回复 分享
发布于 2019-09-10 07:27
第一题考虑一个O(K^3)的算法不行吗?为什么要那么复杂
点赞 回复 分享
发布于 2019-09-13 09:33
他不是说让写写思路就行么?我都没写代码
点赞 回复 分享
发布于 2019-09-13 09:52
POJ 2442
点赞 回复 分享
发布于 2019-09-13 10:03

相关推荐

vegetable_more_exercise:1-1.5万,没错啊,最少是1人民币,在区间内
点赞 评论 收藏
分享
2 16 评论
分享
牛客网
牛客企业服务