2019互联网校招牛客网笔试刷题

写在前言:

题主参加2019年互联网技术类校招笔试,现在在牛客网上刷题,主要刷的方向是

                                                                        C++、数据结构、机器学习                                                                                        

2018. 8.30号刷题:

若有一下程序

1

2

3

4

5

6

#include <stdio.h> 

main(){

    int a=-11,b=10;

    a/=b/=-4;

    printf("%d %d\n",a,b);

A  4 -3
B  -1 -2
C  5 -2 (正确)
D  5 -3

解析:

本题目的关键在于了解“a/=b/=-4”这句话,可以写成“a = a / (b = b / -4)”。从右至左计算可知,先算"b = b / -4",则b = -2,再算“a = a / b”,则a = 5,则选择C

2    判定一个循环队列 qu (最多元素为 MaxSize )为空的条件是 。

A  qu->rear – qu->front ==MaxSize
B  qu->rear – qu->front -1==MaxSize
C  qu->rear ==qu->front
D  qu->rear =qu->front -1

解析:

参考《数据结构C语言版本》第63页,可以判断循环队列为空的标识是qu->rear == qu->front。但是循环队列的空满都满足这个条件。所以有两种方法来区分循环队列的满空。其一是加入一个标志位,标志是满还是空;其二是少用一个元素空间,约定以“队列头指针front在队尾指针rear的下一个位置上”作为队列“满”状态的标志,即循环队列满时:(rear+1)%maxsize=front;循环队列空时:rear == front。

3  

假设声明了以下的函数模板:

template<class T>
T max(T x,T y)
{ return(x>y)?x:y;
}

并定义了int I;char c;

错误的调用语句是(D)。

max(i,i);
max(c,c);
max((int)c,i);
max(i,c);

解析:必须要是相同的数据类型

4  已知某二叉树的前序为(1-2-3-4-5-6-7-8-9),中序为(2-3-1-6-7-8-5-9-4),则它的后续为? (A)

A 3-2-8-7-6-9-5-4-1
B 1-2-6-5-4-3-8-7-9
C 5-4-2-1-3-7-6-9-8
D 2-3-5-4-6-7-9-1-8
E 3-2-1-4-5-9-8-6-7
F 3-2-1-8-7-6-9-5-4

解析:

考察二叉树的三种遍历,根据题目可以得出二叉树为下图

则可以得出正确的答案为A

该题也可以通过先找到根节点做出。

5  "A"是一个字符常量。请问这个说法是正确的吗?(B)

A  正确
B  错误

解析:

考察C++的基础知识。'A'是字符常量,而"A"是字符串常量。

6  给定n个带权结点,其Huffman树的结构是唯一的。(B)

A  是

B  否

解析:当然不唯一。霍夫曼树根据树的深度可以有多这个!!!

7  一棵有124个叶结点的完全二叉树,最多有(B )个结点

A  247
B  248
C  249
D  251

解析:

设完全二叉树的叶子结点数为n0,度为1的结点为n1,度为2的结点为n2。则完全二叉树总的结点个数为n0+n1+n2。现在题目说n0 = 124,并且由公式n2 = n0 - 1,可知n2 = 123,并且根据完全二叉树的性质可知完全二叉树有1个或0个度为1的结点,则n1最大为1,则总结点数为n0 + n1 + n2 = 124 + 1 + 123 = 248,选择B

8  以下有关C语言的说法中,错误的是(D)

A  内存泄露一般是指程序申请了一块内存,使用完后,没有及时将这块内存释放,从而导致程序占用大量内存。
B  可以通过malloc(size_t)函数调用申请超过该机器物理内存大小的内存块。
C  无法通过内存释放函数free(void*)直接将某块已经使用完的物理内存直接还给操作系统。
D  可以通过内存分配函数malloc(size_t)直接申请物理内存。

解析:

要知道malloc和free是申请和释放的虚拟内存,并不是真实的物理内存。所以D选项错误。free释放的内存不一定直接还给操作系统,可能要到进程结束才释放。所以C选项正确。malloc不初始化分配的内存,已分配的内存中可以是任意的值,所以B选项正确。

9  

struct s

{

    int x: 3;

    int y: 4;

    int z: 5;

    double a;

}

求sizeof(s)

A  16
B  32
C  20
D  24

解析:

需要看清楚该结构体中是位操作

 有些信息在存储时,并不需要占用一个完整的字节,而只需占用几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进制即可。为了节省存储空间,并使处理简单,C语言提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

 题目中的x,y,z是一个int型的3个位域,因此以一个int来计算,a是一个double型,字符对齐,因此共占16个字节。

就是x,y,z占了一个int型4个字节,而在存放double型号的时候,根据字节对齐,double应该存放到第8个字节处,则总共是8 + 8 = 16个字节。

x,y,z 分别占用3,4,5 位,int是4个字节32位,相当于xyz 占用4个字节,double 占8个字节,按照对齐原则,前面补4位,4+4+8=16  。并且要知道字节对齐有原则就是最后所占用的字节数要是其中最大内存数据类型的整数倍。

10   下列关于数组与指针的区别描述正确的是?(B)

A  数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。
B  用运算符sizeof 可以计算出数组的容量(字节数)
C  指针可以随时指向任意类型的内存块。
D  用运算符sizeof 可以计算出指针所指向内容的容量(字节数)

解析:

A.堆上创建动态数组

B.sizeof(数组名)就是数组的容量(故正确)

C.const指针不可以

D. char* str = "hello"; sizeof(str)不能计算出内容的容量,只是指针的容量。

2018. 8.30号刷题:

1  Hash 表的平均查找长度与处理冲突的方法无关。(B)

A  正确

B  错误

解析:

考察知识点:哈希表

哈希表的平均查找长度与哈希函数、冲突处理方法和装填因子有关,但与哈希表长无关。

一般情况下哈希函数是均匀的,可不考虑它对平均查找长度的影响

2  不考虑反射,关于私有访问控制符 private 修饰的成员变量,以下说法正确的是(C)

A  可以三种类所引用:该类自身、与它在同一包中的其他类,在其他包中的该类的子类
B  可以被两种类访问和引用:该类本身、该类的所有子类
C  只能被该类自身所访问和修改
D  只能被同一个包中的类访问

解析:

考察类的成员的访问权限和基类成员在派生类中的访问权限。

在子类中,不管是何种继承方式,基类的私有成员访问权限变成不可访问。当然也不可能被同包中的普通类所访问。所以A、B、D都错误。

3  假设已经定义好了一个类student,现在要定义类derived,它是从student私有派生的,定义类derived的正确写法是(C)

A  clase derived::student private{...}
B  clase derived::student public{...}
C  clase derived::private student{...}
D  clase derived::public student{...}

解析:考察派生类的写法格式。

派生类写法为:class 派生类名 : 继承方式 积累名。所以选择C

4  有函数原型void fun2( int );,在下列选项中,不正确的调用是(C)。

A  int a = 21;  fun2( a );
B  int a3 = 15;  fun2( a3 );
C  int b = 100; fun2( &b );
D  fun2( 256 );

解析:对于c选项,形参为int,而&b为int *类型,所以错误。

5  栈和队列都是线性表,只是在插入和删除时受到了一些限制。(A)

A  是

B  否

解析:

栈只能在栈顶进行插入和删除。而队列只能在队头删除、只能在队尾插入。所以正确

6  C ++处理异常的机制是由()三部分组成。

A  编辑、编译和运行
B  检查、抛出和捕获
C  编辑、编译和捕获
D  检查、抛出和运行

解析:

检查、抛出、捕获。

7  在一个被调用函数中,关于return语句使用的描述,(D )是错误的。

A  被调用函数中可以不用return语句
B  被调用函数中可以使用多个return语句
C  被调用函数中,如果有返回值,就一定要有return语句
D  被调用函数中,一个return语句可以返回多个值给调用函数

解析:考察函数的返回return

对于A正确,因为对于void型的函数是没有返回值的,仅是执行一种操作而已。对于B也是正确的,被调函数中是可以有很多return语句的,但是只要函数执行被一个return语句函数便立马返回,函数执行也会立马结束,不会在继续执行剩余的函数体。C是正确的。D错误,因为一个函数只能返回一个值。

8  设有一个二维数组A[m][n],假设A[0][0]存放位置在644(10),A[2][2]存放位置在676(10),每个元素占一个空间,问A[3][3](10)存放在什么位置? (C)
脚注(10)表示用10进制表示

A  688
B  678
C  692
D  696

解析:

因为一个元素占据一个空间。现在可以知道644 + n - 1 + n + 3 = 676, 则n = 15. 则 676 + n - 3 + 4 =692,选C

9  对静态成员的不正确描述(C)

A  静态成员不属于对象,是类的共享成员
B  静态数据成员要在类外初始化
C  调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this指针
D  非静态成员函数也可以操作静态数据成员

解析:

A.静态成员是所有对象共享,在实列化之前就存在,不属于对象。 B.当静态成员是const修饰的整型常量或者枚举型时可以在类内初始化,错误。 C.静态函数在类实例化之前就存在,故不存在this指针,错误。 D.静态函数只能访问静态成员,非静态函数能够访问静态,非静态成员。

10 下列说法错误的有(BCD)

A  数组是一种对象
B  数组属于一种原生类
C  int number=[]={31,23,33,43,35,63}
D  数组的大小可以任意改变

解析:

原生类就8种:int、double、byte、short、long、float、boolean、char,故B错;C选项语法错误;对于D选项,数组的大小一开始就已经确定了 int[]test=new test[2];故B,C,D错误。对于A选项,一切能被Obj 接收的均为对象。

11  下列关于内存分配和释放的函数及其区别描述正确的有?

A  C++语言的标准内存分配函数:malloc,calloc,realloc,free等。
B  C中为new/delete函数。
C  malloc和calloc的区别是1块与n块的区别和初始化
D  realloc调用形式为(类型*)realloc(*ptr,size):将ptr内存大小增大到size。

解析:

new/delete是操作符 不是函数,故B错误;
malloc的函数原型:void* malloc (size_t size);申请1*size大小的空间
calloc的函数原型:void* calloc (size_t num, size_t size);申请num * size大小的空间
即1块 和 n块,故D对;

12  在16位IBM-PC上使用C语言,若有如下定义:

struct data 

int i; 

char ch;

double f;

} b;

则结构变量b占用内存的字节数是(D)。

A  1

B  2

C  8

D 11

解析:

16位下,int 2字节 char 1字节 double 8字节 这个版本的编译器太旧了,没有内存对齐,故是11个字节。

13  以下多维数组声明语句中,不正确的有(  )。

A int[,]a = new  int[2,3];
B int[,] a = {{1,2,3}};
C int[2,3] a = new int[2,3];
D int[,] a = {{1,2,3},{2,3}}

解析:

b项中间的大括号少逗号  ,故B错。

17  设栈的顺序存储空间为S(1m),初始状态为top=m+1。现经过一系列正常的入栈与退栈操作后,top=0,则栈中的元素个数为(A)

A 不可能
B m+1
C 1
D M

解析:不明白这题

18  任何一棵二叉树都可以不用栈实现前序线索树的前序遍历(A)

A  是

B  否

解析:

A正确,因为线索二叉树,直接使用指针来遍历即可,可以不用栈来辅助。

19  已知const char * node="ABC";下列语句合法的是___.

A node[2] = 'k';
B *node[2]='k';
C *node = "xyz";
D node="xyz";

解析:考察指针常量和常量指针

const char * node="ABC"

这是一个指向字符常量的指针,也就是 *node 的值不能被改变

A, node[2] = 'k';更改coust类型的值,编译不通过

B,*node[2]这种写法本身就是错误的

C,*node = "xyz"; 前面说了,*node的值不能改变

D,node是指针类型,node指向的内容不能改变,但是node指针本身可以改变

   node="xyz";这里是让node指向“xyz”的首地址

猜你喜欢

转载自blog.csdn.net/qq_33221533/article/details/82224803
今日推荐