面试题笔记(三)

1.链队(队列)

先进先出,允许插入的一端为队尾,允许删除的一端为队头

2.

数据的逻辑结构分为线性结构和非线性结构。

线性结构:一对一关系

非线性:

树形结构:一对多关系

图形或网状结构:多对多关系

集合:结构中的数据元素之间除了“同属于一集合”的关系外,别无其他关系

                 

          数据结构:相互之间存在一种或多种特定关系的数据元素的集合。

          结构:     数据元素相互之间的关系

          根据数据元素之间关系的不同特性,通常有下列 4 类基本结构:

a)      集合:

b)      线性结构

c)      树形结构

d)      图状结构或网状结构

3.

C语言中数据以补码形式保存,-32767原码为11111111 1111,补码为10000000 0001,第一位为符号位,变为无符号时,就是正数,所以补码与原码相同,结果为32769

4.

pthread_join(t,NULL)意思是等待线程t执行结束了再执行下面的代码。但在这之前,3个线程都已提交,它们可能都已经顺序随机地执行了,也可能没有,所以结果也是不可预测的。

不懂Linux下的C的线程,不过Java中的thread.join也是这个意思。

5.引用一定要赋初始值

要注意的是,不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。

6.

未定义行为(Undefined Behavior)是指C语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又或者如果程序调用未定义的行为,可能会成功编译,甚至一开始运行时没有错误,只会在另一个系统上,甚至是在另一个日期运行失败。当一个未定义行为的实例发生时,正如语言标准所说,“什么事情都可能发生”,也许什么都没有发生。一句话,未定义行为就是运行结果不确定

1.变量即是左边结果,又是右边的操作数,如a+=a++,a %= b ^= a ^= b ^= a

2.使用越界数组也是C的一个“未定义行为”

3.允许一个随便指的指针的读写。

4.使用未初始化的变量

等等

A选项,不知道编译器会怎么选择自增和赋值的顺序,所以这是由编译器决定的,属于未定义行为。

B选项,”hello“这个字符串属于一个字符串常量了,指针p指向了这个字符串常量,通过这个指针来直接修改常量第二个字符,这也属于未定义行为。

C选项,只是通过指针找到第二个字符并将它赋值给一个字符变量,并没有改变这个字符串常量,所以不属于未定义行为。

D选项,在printf语句中,i++和i–谁先执行由编译器决定,这是未定义行为。

7.

1. malloc,calloc,realloc,free属于C函数库,而new/delete则是C++函数库;

2. 多个-alloc的比较:

    alloc:唯一在栈上申请内存的,无需释放;

    malloc:在堆上申请内存,最常用;

    calloc:malloc+初始化为0;

    realloc:将原本申请的内存区域扩容,参数size大小即为扩容后大小,因此此函数要求size大小必须大于ptr内存大小。

8.对链表进行插入和删除操作时不必移动链表中结点

9.查找和修改,索引不是操作,只有接触到具体数组数据的才算是操作,索引只是数组的下标!

10.线性表是具有 n 个数据元素的有限序列(n>0)

数据元素也叫节点或记录,由数据项组成,

比如 一本书:

(数据元素):书目信息;

(数据项):书名、作者、总页数等

11.

scanf函数的标准输入格式为:scanf(格式控制字符串,地址列表);

其中格式控制字符串的一般形式为 %[*][数据宽度][长度]类型。

1.类型 :%o (八进制)、%d(十进制)、%x(十六进制)、%f (字符型)、%u(无符号类型)、%c (字符型)、%s(字符串型)

2.数据宽度:用十进制整数来指定字符宽度 例如

int a,b;

scanf("%5d",&a);

当输入为1234567时,截取前面5位赋给a,则有a=12345

scanf("%4d%4d",&a,&b);

当输入为12345678时,此时截取前4位给a,后4位给b,则有a=1234,b=5678

3.长度:长度格式符为l或h,其中l表示长整型数据例如%ld、双精度浮点数%lf,h表示的是短整型数据

当输入多个数值型数据时,如果格式控制字符串中没有非格式字符(逗号、空格等 ) 出现 ,例如scanf("%d%d",&a,&b);此时在输入数据时可以用空格、TAB或回车来表示输入数据之间的间隔,比如输入 1_2(回车) (这里下划线表示的是空格),则a=1,b=2

4.如果格式控制字符串中有非格式字符,则输入时也需要输入相应的非格式字符(正如本题所示的输入中含有非格式字符 a=, b= 因此在输入的时候也应该输入a=, b=)

例如

int a,b;

scanf("%d,%d",&a,&b);含有非格式字符逗号,在输入数据的时候就应该输入1,2  此时有a=1,b=2

5.%*,表示的是在输入数据时将会跳过这个数值

例如

int a,b;

scanf("%d,%*d,%d",&a,&b);输入1,2,3 时,2将被跳过赋值,有a=1,b=3

12

.

存在性就是变量生命周期。可见性就是能访问。
内部静态类就是只有在包含该类的上下文里才能使用的类,比如在一个类内部定义的类。但它是全局存在的。

13.函数的定义不可以嵌套,但函数的调用可以嵌套

14.一般来说,在线性表的链式存储结构中,各数据结点的存储空间是不连续的,并且各结点在存储空间中的位置关系与逻辑关系也不一致。线性链表中数据的插入和删除都不需要移动表中的元素,只需改变结点的指针域即可。

15.

【解析】 B 选项描述不正确,指针变量可以通过求地址运算符( &) 来获得地址值,可以通过指针变量获得地址值,还可以通过标准函数获得地址值; C 选项中, p=NULL ;和 p=0 ;或 p='\0' ;等价; D 选项中,语句 p=NULL; 执行后,指针 p 并不是指向地址为0 的存储单元,而是具有一个确定的值 -" 空 " 。因此 A 选项正确。

16.

17.简单匹配算法的时间复杂度为O(m*n),KMP匹配算法时间复杂度为O(m+n).。

18.

auto根据数据类型分配内存,register在使用到时分配CPU寄存器地址

19.堆栈

选C,静态分配是指在编译阶段就能确定大小,由编译器进行分配,堆不可以进行静态分配,堆的申请都是在执行过程中进行的。

A,堆和栈的大小都可以设置,栈一般只有几KB。

B,堆在动态分配时,要申请连续的内存空间,释放后会产生碎片。

D,堆是使用malloc()、calloc()、realloc()等函数动态分配的,而使用alloca()函数可以动态分配栈的内存空间,释放的时候由编译器自己释放。

20.

A选项:长度为0 的串为空串,即为“” 。由多个空格字符构成的字符串称为空格串

B选项:如果权值最小的n-1条边构成了环的话,就不能构成最小生成树

D选项:平衡二叉树的左右子树高度之差的绝对值不超过1.

C选项:选择排序包括直接选择排序和堆排序,都是不稳定的算法

21.

fprintf函数只能以字符串的形式写入到文件中;fread函数则是从文件中读数

据,而不是写数据;fputc函数是以字符的形式写到文件中:而fwrite函数则是将某数以其

机器数的形式写入到文件中。故选择答案是C。

22.KMP算法时间复杂度为O(m+n),空间复杂度为O(m)。 因为KMP算法涉及到next数组的存储,且next数组是基于模式串长度计算的。

23.

scanf和printf是库函数,这就是为什么要有#include<stdio.h>,C语言没有提供如何输入输出函数和语句。
C语言不提供函数,只提供一些关键字比如int,和一些语法标准。

printf默认为右对齐,%-2d为左对齐

猜你喜欢

转载自blog.csdn.net/cb673335723/article/details/81141477