zoukankan      html  css  js  c++  java
  • 模拟面试第一弹~

    说下基本规则:基本是45分钟两道题,基本一题20分钟。

    要是一题半天都没有分析出来,就相当于这轮基本挂了。(要是想不出来,只能看面试官给你多少提示了--)

    第一题:给一个大小为n的有序数组, 找出出现次数大于 n/4 的元素。

    分析:我们一开始就能想到brute force的做法就是2根指针遍历,复杂度 O(n)。

    但是不够优秀,面试官会问你better solution。那既然有序,又要降复杂度,我们就肯定想到了二分。但是怎么二分呢?

    |--------|--------|---------|--------| 

    0            c1             c2             c3             n-1

    这个数必然是 c1, c2, c3, nums[n-1] 中的一个。因为要求长度大于 n/4 啊~~~~

    我们要从这几个candidate中判断那个是,就要判断从c1往左往右延伸的长度是否大于 n/4。这个左边界和右边界怎么求就是二分求啦。

    我一般写 lower_bound, upper_bound, 但是二分怎么写要会呀。

    第二题:Get Transitively Imported Files

    想一下写程序的时候的头文件包含, 本题需要设计一个函数,返回一个文件所有包含和间接包含的所有文件。 set<string> getTransitivelyImportedFiles (string filename)

    file1:
    import file2;
    import file3;
    
    file2:
    import file3;
    
    file3:
    import file4;
    
    file4:
    import file1;

    给了一个函数:vector<string> getDirectlyImportedFiles(string filename), 这个函数直接返回一个文件直接包含的文件名。

    eg: getDirectlyImportedFiles(file2) ---> {file3}

    eg: getTransitivelyImportedFiles(file2) ---> {file3, file4, file1, file2}

    题解:直接bfs。

    follow up: 假设这个getDirectlyImportedFiles这个函数是api调用,会有比较大的网络开销,那么怎么办能加速呢?

    面试的同学说多线程,每次把队列里面的都取出来,然后多线程调用这个api。这个多线程就可以说很多东西了, 大概说了几个名词和知识点。

    countDownLatch, join, thread pool,

    多线程的弊端:

    (1)线程需要线程池管理,不然队列里面东西太多了,线程数太多的话,系统就挂了

    (2)network congestion, 一台机器的socket连接数是有限的,太多了也有问题,我们虽然可以用multiplexing(多路复用)(一个socket)来处理这个问题。

    那么follow up的正解是什么呢?

    就是更改我们的getDirectlyImportedFiles这个api,把这个api的入参从单个string改成vector。批量取的接口。

  • 相关阅读:
    python之处理excel表格
    Django下JWT的使用
    Flask的上下文管理
    模块循环引用
    博客声明及意义
    IPTABLES--iptables
    挂载U盘
    tar压缩解压
    iconv字符编码转换
    VirtualBox设置共享文件夹
  • 原文地址:https://www.cnblogs.com/zhangwanying/p/9724637.html
Copyright © 2011-2022 走看看