2021年迅雷网络技术公司面试题(C++工程师岗位)

小编:管理员 1282阅读 2021.06.09

第1题:


 一、单选题

下列for循环的循环体执行次数为

 

for(int i=10, j=1; i=j=0; i++, j--)

    

A  0

B  1

C  无限

D  以上都不对

 


答案: A

解析:这个问题可以这样理解,在for(string1;string2;string3)中,string1用于设定循环变量处置,string2用于循环判断,string3用于改变循环变量到调节,一般情况下,我们采用逻辑判断表达式来决定循环是否执行,而如果在这里采用赋值语句,其逻辑值始终为假,导致循环不执行


第2题:


 下面程序的输出结果是

char *p1= “123”, *p2 = “ABC”, str[50]= "xyz";

strcpy(str+2,strcat(p1,p2));

cout << str;

 

A  xyz123ABC

B  z123ABC

C  xy123ABC

D  出错



答案: D

解析:strcat(p1,p2)出错,因为p1只被分配了4个字节的地址空间,将p2拼接在p1后面会引起内存溢出。


第3题:


 下面函数的执行结果是输出


char str[ ] = “xunlei”;

char *p = str;

int n = 10;

printf(“%d, %d, %d/n”, sizeof(str), sizeof(p), sizeof(n));

 

A  4, 4, 4

B  7, 4, 4

C  6, 4, 4

D  6, 6, 4




答案: B

解析:指针和int、float类型均占4个字节,而sizeof(str)包括'\0'所以是7个字节


第4题:


 


char *p, *q;

p = (char*) malloc(sizeof(char) * 20);

q = p;

scanf(“%s %s”, p, q);

printf(“%s %s/n”, p, q);

  

若从键盘输入:abc def, 则输出结果是

 

A  def def

B  abc def

C  abc d

D  d d




答案:A

解析:q=p;因此p,q指向的是同一段内存.scanf先是把abc写到p指向的空间,再把def写到q指向的空间,也就是同一段空间,因此abc被def覆盖了。


第5题:


 现在有以下语句:

struct _THUNDER{

       int iVersion;

       char cTag;

       char cAdv;

       int iUser;

       char cEnd;

}Thunder;

int sz = sizeof(Thunder);

则执行后,变量sz的值将得到

 

A  11

B  12

C  13

D  16



答案:D

解析:结构体默认对齐方式为8,则iVersion取4字节对齐,CTag、CAdv和cEnd取2字节对齐,结构体大小为14,14不为4的整数倍,补空字节,增至16时符合所有条件,则sizeof(Thunder)为16。


第6题:


 有如下程序段:


void GetMemeory(char* p)

{

    p = (char*) malloc (100);

void test()

{

    char *str=NULL;

    GetMemory(str);

    strcpy(str,”Thunder”);

    strcat(str+2, “Downloader”);

    printf(str);

}

   

请问运行Test函数结果是:

 

A  Thunder Downloader

B  under Downloader

C  Thunderownloader

D  程序崩溃




答案: D

分析:在函数中给指针分配空间,实际上是给指针的临时变量分配空间,函数结束后,这个临时变量也消亡,而str仍然为NULL,没有为其分配空间,此时strcpy()是肯定会出错的。


第7题:


         p是指向类X的成员m的指针,s是类X的一个对象。现要给m赋值,()是正确的。

       

A  s.p = 5

B  s->p = 5

C  s.*p = 5

D  *s.p = 5



答案:C


第8题:


 函数


fun(char* p) {

    return p;

}

   

的返回值是

            

A  无确切值

B  行参p中存放的地址值

C  一个临时存储单元的地址

D  行参p自身的地址值




答案:B

分析:可参考找工作笔试面试那些事儿(3)---内存管理那些事,返回的是形参p中存放的地址值。


第9题:


 a,b均为不等于0的整形变量,以下关系式恒成立的是:

       

A  a*b/a*b == 1

B  a/b*b/a == 1

C  a/b*b + a%b == a

D  a/b*b == a



答案:C

解析:a/b得到的是去除余数后的值,再加上a%b取摸的值就等于a了,所以选C


第10题:


 设有如下说明:


typedef struct ST{

    long a; int b; char c[2];

} NEW;

    

则下面叙述中正确的是:

           

A  以上的说明形式非法

B  ST是一个结构体类型

C  NEW是一个结构体类型

D  NEW是一个结构体变量




答案:C

解析:struct ST 等价于 NEW,为同一个结构类型


第11题:


二、不定项选择

下列表达式中,不合法的是()
已知:double d = 3.2; int n = 3;

     

A  d<<2;

B  d/n

C  !d && (n-3)

D  (d-0.2)|n



答案: A D

解析如下:

(1)float、double、long  double等类型不允许直接进行位与操作符啊,可用间接的方法变通,如float取地址(也是&符号)转换为unsigned  int类型,再用取值操作符(*),这样编译器会以为是unsigned int类型。

(2)使用int、short、long移位时最好加上unsigned,这样就是汇编中逻辑移位(即全部移位),如果不加unsigned情况就较为复杂,正数全是逻辑移位,负数左移时保持符号位为1、右边补0,负数右移时保持符号位为1,左边补1,所以-1不管怎么右移都是-1。

(3)位与操作符就是将两个数进行与操作,&0x01就相当于掩码取出最后一位,其他位置成0

(4)位与操作符&的操作优先级小于移位操作符,但移位操作符小于取地址操作符&(取值操作符*),所以上面代码不会出错


第12题:


 下面描述正确的是()

        

A  while循环语句的循环体至少执行1次

B  do-while循环可以写成while循环的格式

C  continue语句可以出现在各种循环体中

D  break语句不可以出现在循环体内



答案:  BC

解析:break语句可以出现在switch语句块中,while循环体可能不会执行


第13题:


 关于内联函数正确的是()

       

A  类的私有成员函数不能作为内联函数

B  在所有类说明中内部定义的成员函数都是内联函数

C  类的保护成员函数不能作为内联函数

D  使用内联函数的地方会在运行阶段用内联函数体替换掉



答案: B

解析如下:

A是可以的,私有成员函数可以内联

C也可以

D应该是在编译阶段替换


第14题:


下面模板声明中,哪些是非法的()

 

A  templateclass C1;

B  templateclass C2;

C  templateclass C3{};

D  templateclass C4{};



答案: B D

解释:  B选项的U参数没有指定类型, D选项的 2个形参名同名。

函数模板的格式:

template  返回类型        函数名(参数列表)  

{       

函数体  

}  


 

类模板的格式为:  

template   class 类名              

{ ... };      


第15题:


在使用浏览器打开一个网页的过程中,浏览器会使用的网络协议包括()

           

A  DNS

B  TCP

C  HTTP

D  Telnet



答案: ABC

思路:使用DNS去获得域名的主机ip,使用HTTP去获得报文交互,而HTTP是基于TCP协议的


第16题:


三、问答题

有n个文件的长度记载在一个无符号64位整数数组中unsigned__int64 file_length[n],把这n 个文件从逻辑上按序首尾拼接在一起形成一个逻辑上的大文件,然后以每块长度为unsigned block_length把这个逻辑上的大文件划分成大小相等的数据块(当然,最后一块有可能比block_length小),请定义和实现一个函数,把边界块的序号集合返回给函数的调用者(第一个数据块序号为0)。
注:边界块指的是跨多个文件的数据块。



 vector findSeq(unsigned __int64* file_length,int n,  unsigned block_length)

{

    vector seqnums;

    unsigned __int64 totalSize = 0;

    int preSeq=-1;

    for(int i=0; i

        totalSize += file_length[i];

        int seq = totalSize/block_length;

        if(!(totalSize%block_length)){

        seq--;

        }

       if(preSeq==seq){

            if(seqnums.empty()||seqnums.back()!=seq){

                  seqnums.push_back(seq);

            }

       }

 preSeq = seq;

    }

    return seqnums;

}


第17题:


 请实现一个函数,把两个从大到小的有序链表合并成一个链表,新的链表是一个从小到大的有序链表。

struct list

{

    int value;

    list* next;

};

list * merge (list *list1_head, list*list2_head);



 

    list *merge(list *list1_head,list *list2_head)

    {

        list *newlist = NULL;

        list *current = NULL;

        while(NULL!=list1_head && NULL!=list2_head)

        {

            if(list1_head->value > list2_head->value)

            {

                current = list1_head->next;

                list1_head->next = newlist;

                newlist = list1_head;

                list1_head = current;

            }

            else

            {

                current = list2_head->next;

                list2_head->next = newlist;

                newlist = list2_head;

                list2_head = current;

            }

        }

 

        while(NULL!=list1_head)

        {

            current = list1_head->next;

            list1_head->next = newlist;

            newlist = list1_head;

            list1_head = current;

        }

        while(NULL!=list2_head)

        {

            current = list2_head->next;

            list2_head->next = newlist;

            newlist = list2_head;

            list2_head = current;

        }

        return newlist;

    }


第18题:


 如果两个英文单词,组成它们的字符集合相同,而且相同字符出现的次数也相同,则称这两个词匹配:比如说:同”abbc”与词 ”babc”是匹配的。有一个词典,存储在字符串数组const char* dictionary[n]中,数组的每一个元素是一个词。对于任意给出的句子。句子中的单词使用空格分割。请实现以下函数,判断句子中是否有词和词典中的词匹配。
bool is_matching( const char* dictionary[],int n, const char* sentence);



 abbc 和 babc 同的话, 即词语单个字符的ascii码和相同即词语相同。 把字符串比较转换成 int 型数字比较。
 数组中所有词转换成int 放入 int数组。
比较大小


关联标签: