返回

人人 2021 研发岗面试题

第1题:

 以下排序中时间复杂度最差的是

   

A  归并排序

B  选择排序

C  希尔排序

D  堆排序



 B



第2题:

 当参数*x==1, *y==1, *z==1时,下列不可能是函数add的返回值的( )?


int add(int *x, int *y, int *z){

    *x += *x;

    *y += *x;

    *z += *y;

    return *z;

 }

     

A  4

B  5

C  6

D  7




 D

开始不知道啥意思,后经牛客网的大神指点才知道这题要考虑的是,x,y,z三个参数是否指向同一地址(或者说调用该函数时是否实参相同),如:当a=b=c=1时,add(&a,&a,&a),add(&a,&b,&c)。

通过写程序测试得出结果,不可能得到答案7。



第3题:

 体育课的铃声响了,同学们都陆续地奔向操场,按老师的要求从高到矮站成一排。每个同学按顺序来到操场时,都从排尾走向排头,找到第一个比自己高的同学,并站到他的后面,这种站队的方法类似下列哪种算法?

  

A  快速排序

B  插入排序

C  冒泡排序

D  归并排序



 B



第4题:

 下面关于inode描述错误的是?

 

A  inode和文件是一一对应的

B  inode能描述文件占用的块数

C  inode描述了文件大小和指向数据块的指针

D  通过inode实现文件的逻辑结构和物理结构的转换



 A



第5题:

 设有一个栈,元素依次进栈的顺序是A,B,C,D,E。下列不可能的出栈顺序有?

         

A  ABCDE

B  BCDEA

C  EABCD

D  EDCBA



 C

进一个出一个的序列为A

AB进栈B出栈C进栈出栈D进栈出栈E进栈出栈A出栈的序列为B

全部进栈再出栈的序列为D,栈为先进后出的数据结构,无论如何都不会出现C的情况,故选C



第6题:

 某二叉树结点的中序序列为A、B、C、D、E、F、G、H,后序序列为B、D、C、A、F、G、H、E。该二叉树对应的树林结点的层次次序序列为?

  

A  E、G、H、F、A、C、D、B

B  E、A、H、C、G、B、D、F

C  E、A、G、H、C、F、B、D

D  E、G、A、C、H、D、F、B



 B

由后序序列知E为根节点,再由中序遍历知左子树为ABCD,右子树为FGH

由后序遍历BDCA知,A为BDC父节点,BDC为右子树,其中C为BD父节点,B为C的左孩子,D为C右孩子,该树左半部分完成

由中序序列和后序序列知FGH序列不变,则H的左孩子为G,G的左孩子为F,H为E的右孩子,该树可知其层次次序序列为EAHCGBDF,故选B



第7题:

 假设平均每个人人用户有300个好友,则一个人人用户的3跳好友数的数量级是?

   

A  十万级

B  百万级

C  千万级

D  亿级



 C

300的3次方,27000000,如果包含相互好友、共同好友的话还会比这个少。



第8题:

 下列哪些因素不会限制Linux服务器并发连接数?

 

A  系统内存大小

B  系统网卡数量

C  系统最大文件句柄数量

D  系统IP地址数量



 B

网卡数量。选择B


第一个,就是ip地址数,系统ip数越多,建立连接数越多。


第二个,内存。从配置文件角度说吧

用vim打开配置文件:#vim  /etc/sysctl.conf

net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力。

net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段。

net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket。

上述内存单位是页,而不是字节。内存大小影响网络  


第三个。其他,句柄最大数影响network 在vfs操作的上限。



最后。这么高大上的问题,我们先来看一个故事吧:


100万并发连接服务器笔记之Erlang完成1M并发连接目标

100万并发连接服务器笔记之1M并发连接目标达成

100万并发连接服务器笔记之测试端就绪

100万并发连接服务器笔记之处理端口数量受限问题

100万并发连接服务器笔记之准备篇




第9题:

 二、填空题

在区间[-1, 1]随意取两个数,它们的和大于1的概率是_________。(分数表示)



 1/8



第10题:

 n从1开始,每个操作可以对n加1或加倍,如果要使n是2021,最少需要________ 个操作。



 18

int minimum_step(int n) {

    vector dp(n + 1);

    dp[1] = 0;

    for (int i = 2; i <= 2021; i++) {

        dp[i] = dp[i - 1] + 1;

        if (i % 2 == 0) {

            dp[i] = min(dp[i], dp[i / 2] + 1);

        }

    }

    return dp[2021];

}



第11题:

 三、问答题

给出二叉树接口为


class node

{

    node *get_left();

    node *get_right();

    int get_data();

}

   

找出值为val的最浅节点所在层数。

int find(node *root, int val).




 

int find(node * root, int val) {

    int ret = 1;

 

    if (root->get_data() == val) {

        return ret;

    } else {

        int  ret1 = 1 + find(root->get_left(), val);

        int  ret2 = 1 + find(root->get_right(), val);

        if (ret1 > ret2)

            ret = ret2;

        else

            ret = ret1;

 

        return ret;

    }

}



第12题:

 计算机中处理乘法的指令要比加法复杂的多, 因为在一些关键系统中我们常常会考虑如何尽可能减少乘法的运算。

现在有如下的表达式

y= anxn+an-1xn-1 +…..+a1x +a0

其中an, an-1, ….a1, a0是常数, 给一个x, 要求尽快算出y的值。请尝试写出这样的一个函数。



 思路: 

F0=an;

F1=anx+an-1
Fn=xF(n-1)+an-1

代码:    

function sum(int a[], int n, int x){

    s=a[n]

    for(int i=1; i<=n; i++){

        s += x*s + a[n-i]

    }

    return s;

}


相关知识