• Summarization of Tech Interviews


    Summarization of Tech Interviews(技术面试总结)

    手心网(2015)

    Q1. 解释一下 TCP/IP 协议之滑动窗口?

    滑动窗口协议的维基:https://en.wikipedia.org/wiki/Sliding_window_protocol

    Q2. UDP 包大小,什么时候应该用 UDP / TCP?

    UDP 包大小理论上在 8 - 65535 byte ,IPv4 协议下数据域实际大小:65507 byte。

    Q3. 抽奖/秒杀/抢购系统的设计?

    贾浩:利用 MySQL 特性来解决“写数据的原子性”。缺点:“原子性的写”可能是靠加锁实现,这也就大大降低了性能,因为 Unix 是分时系统。
    我:应该根据用户量,酌情使用 redis 集群特性。使用 hashtable 数据结构,这样能在 O(1) 的时间复杂度内完成判断。使用“一致性 hash ”路由算法。 0~(2^{32}) 空间内,对用户ID进行模运算。

    贾浩 A:利用 update 操作的原子性,预先设置抢购商品数量个令牌,当用户请求来时,先校验所剩的令牌数,有剩余表示该用户可以抢购。

    UPDATE 抢购表 uid = $uid, token = 0 Where token = 1 and token = 1
    

    我 A : MySQL 并发时,可以加写锁:最常用的两种引擎大概是 MyISAM 和 InnoDB,他们分别实现了表锁和行级锁。

    令牌系统,不合理的请求在前端被档,不会到后端,保证了后端系统稳定。这也保证了 MySQL 写数据的原子性。A 2 : 令牌桶算法(Token Bucket)——网络流量整形、速率限制

    贾浩:抢购系统原理 UPDATE 原子性 + token 预先分配

    Q4. call_user_func VS. sql_autoload_register() + spl_autoload() 方案选择

    贾浩:为什么不用 PHP 原生特性?

    我:使用 SPL 加载类,可以保证框架的完全面向对象特性,比如使用

    Input::get('name');
    URL::segement(3);
    

    如果使用 call_user_func 必须先手动加载对应文件,所以 CI 框架会有丑陋的写法:

    $this->load->('input');  //都需要先load
    $this->input->get('name');
    
    $this->load->('url');    //需要先load
    $this->url->segement(3);
    

    链家网——电话面试(2015)

    Q1. 十万个数,找出最小的前K个?

    容量为K的最小堆,时间复杂度O(N × logK),《编程之美》之“2.5寻找最大的K个数”。

    Q2. PHP 生命周期?

    Q3. fpm 生命周期?

    链家——现场面试(2015)

    Q1. 如何改善你的“Power 8 极限算法挑战赛第六期”算法?

    用 bitset 改善“Power 8 极限算法挑战赛 第六期”程序,优化程序所使用的内存。优化后,空间占用减少到3MB。程序数据将会存储在CPU cache L3 中,数据相对CPU的“距离”越近、读写速度越快。

    Q2. 外部排序:利用 3MB 的内存空间对磁盘中 10G 的数进行排序,数据取值范围 0 ~ 10^7?

    使用“多趟桶排序”进行排序。但技术总监面(二面时)否定了该解法。我后来反思觉得,用多趟桶排序还是能解的!(具体解法有待后续更新)

    2016年6月28日更新:

    利用B树也是很好的解决方式,而且很多成熟的方案(比如MySQL)都是在利用B树的变种来组织数据。首先,生成B树、然后从小到大地层序遍历,这样就相当于进行了排序。

    Q3. 动态规划之以O(n)时间复杂度解决 “最大连续子数组和”问题?

    int MaxSubString(int* A, int n)
    {
        int Start = A[n - 1];
        int All = A[n - 1];
        
        for (int i = n - 2; i >= 0; i--)    //从后向前遍历,反之亦可。
        {
            Start = max(A[i], A[i] + Start);
            All = max(Start, All);
        }
    
        return All;                       //All[0] 中存放结果
    }
    

    参考资料:http://www.cnblogs.com/waytofall/archive/2012/04/10/2439820.html

    Q4. PHP zval 的代码实现?

    解:

    它的实现是在 Zend/zend.h 文件中。:

    struct _zval_struct {
        zvalue_value value; /* 变量的值 */
        zend_uint refcount__gc;
        zend_uchar type;    /* 变量当前的数据类型 */
        zend_uchar is_ref__gc;
    };
    typedef struct _zval_struct zval;
    
    //在Zend/zend_types.h里定义的:
    typedef unsigned int zend_uint;
    typedef unsigned char zend_uchar;
    

    保存变量值的value则是zvalue_value类型(PHP5),它是一个union,同样定义在了Zend/zend.h文件里:

    typedef union _zvalue_value {
        long lval;  /* long value */
        double dval;    /* double value */
        struct {
            char *val;
            int len;
        } str;
        HashTable *ht;  /* hash table value */
        zend_object_value obj;
    } zvalue_value;
    

    具体的介绍都在 https://github.com/walu/phpbook/blob/master/2.1.md 里面。

    但是 PHP7 之后对 _zval 进行了改进,具体代码定义在 php7.0.3/Zend/zend_types.h 中:

    typedef union _zend_value {
        zend_long         lval;                /* long value */
        double            dval;                /* double value */
        zend_refcounted  *counted;
        zend_string      *str;
        zend_array       *arr;
        zend_object      *obj;
        zend_resource    *res;
        zend_reference   *ref;
        zend_ast_ref     *ast;
        zval             *zv;
        void             *ptr;
        zend_class_entry *ce;
        zend_function    *func;
        struct {
            uint32_t w1;
            uint32_t w2;
        } ww;
    } zend_value;
    
    struct _zval_struct {
        zend_value        value;            /* value */
        union {
            struct {
                ZEND_ENDIAN_LOHI_4(
                    zend_uchar    type,            /* active type */
                    zend_uchar    type_flags,
                    zend_uchar    const_flags,
                    zend_uchar    reserved)        /* call info for EX(This) */
            } v;
            uint32_t type_info;
        } u1;
        union {
            uint32_t     var_flags;
            uint32_t     next;                 /* hash collision chain */
            uint32_t     cache_slot;           /* literal cache slot */
            uint32_t     lineno;               /* line number (for ast nodes) */
            uint32_t     num_args;             /* arguments number for EX(This) */
            uint32_t     fe_pos;               /* foreach position */
            uint32_t     fe_iter_idx;          /* foreach iterator index */
        } u2;
    };
    

    沈阳小公司(2015)

    Q1. 设计抢购系统,分为两种策略:(1)固定中奖概率、固定人数 (2)固定中奖概率、不固定人数?

    百度外卖(2016)

    Q1. PHP 的 foreach 函数对于如下代码,输出的顺序将是是怎样的?

    $arr[0] = 'a';
    $arr[2] = 'b';
    $arr[1] = 'c';
    
    foreach($arr as $a)
        echo $a;
    

    解:

    输出 abc。

    Q2. 百度外卖的订单系统,怎样设计才能最大程度地拓容?——包含订单表、商户表、用户表?

    Q3. 打印回形数组?

    Q4. (同链家网)PHP内核 zval 实现?

    Q5. 设计一个抢购/秒杀系统?

    Q6. 对消息队列的认识和理解,比如 Kafka?

    小肚皮(2017)

    Q1. 上机写出这样的程序:

    该公司有男性员工m人,女性员工n人,要求设计一种算法用来安排周一和周四两天的午餐分组安排,设每组有x人(x是正整数且是偶数),男女比例1:1(某组人数不足x的除外),周一和周四的分组安排不能相同。

    HIGO(2017)

    Q1. 手写算法,如何从二叉树中找出两个距离最远的节点?

    解:

    像拎葡萄一样,先从跟节点拎一下,找出最长的节点,记为 node1;然后再从 node1 节点拎一下,找出当前最长的节点,记为 node2。node1 和 node2 既为两个距离最远的节点。

    Q2. 上机写 SQL,利用如下三个表,列出每个商店商品数量第一多的类目?列出每个商店商品数量第一多的类目?

    shop

    sid sname
    1 s1
    2 s2

    category

    cid cname
    1 c1
    2 c2

    goods

    gid sid cid gname
    1 1 1 g1s1c1
    2 1 1 g2s1s1
    3 1 2 g3s1c2
    4 2 1 g4s2c1
    5 2 2 g5s2c2
    6 2 2 g6s2c2
  • 相关阅读:
    AutoCAD LISP 循环选择语句cond
    AutoCAD LISP利用子程序绘制田字格
    java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListen
    java.lang.IllegalArgumentException: node to traverse cannot be null!
    扩展jQuery easyui datagrid增加动态改变列编辑的类型
    eclipse管理多个workspace(转载)
    JBPM4 No unnamed transitions were found for the task 'XXXX'
    MySQL 日期计算
    jbpm与spring整合不停显示查询语句select jobimpl0_.DBID_ as DBID1_6_, jobimpl0_.DBVERSION_ as DBVERSION3_6_......
    在可编辑datagrid中,使用my97日期控件
  • 原文地址:https://www.cnblogs.com/fengyubo/p/7417226.html
Copyright © 2020-2023  润新知