笔试相关
1. 在数据库逻辑设计中,当将E-R图转换为关系模式时,下面的做法哪一个是不正确的?
A.一个实体类型转换为一个关系模式
B.一个联系类型转换为一个关系模式
C. 由实体类型转换成的关系模式的主键是该实体类型的主键
D. 由联系类型转换成的关系模式的属性是与该联系类型相关的诸实体类型的属性的全体
答案:D
解析:E-R图转换为关系模型的原则有:
(1)一个实体型转换为一个关系模式。
关系的属性:实体型的属性。
关系的码:实体型的码。
(2)一个m:n联系转换为一个关系模式。
关系的属性:与该联系相连的各实体的码以及联系本身的属性。
关系的码:各实体码的组合。
(3) 一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并
(4) 一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
2.关于非空二叉树的性质,下面哪个结论不正确
A. 有两个子节点的节点一定比没有子节点的节点少一个.
B. 根节点所在层数为第0层,则第i层最多有2^i个结点
C.若知道二叉树的前序遍历序列和中序遍历序列,则一定可以推出后序遍历序列
D.堆一定是一个完全二叉树
答案:D(堆不一定是完全二叉树,但是一般采用完全二叉树,主要是利于存储和运算)
3.给定声明const char* const * pp; 下属操作或说明正确的是:
A. pp++;
B. (*pp)++;
C. (**pp) = 'c';
D. 以上都不对
答案为A.
注释:
根据ANSI C标准的赋值约束条件:
1. 两个操作数都是指向有限定符或无限定符的相容类型的指针。
2. 左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。
对于const char*和char*:
const char*的类型是:“指向一个具有const限定符的char类型的指针”。(不能修改其值)
char*的类型是:“指向一个char类型的指针”。
因此const char*和char*都是指向char类型的指针,只不过const char*指向的char类型是const的。
因此对于代码:
char* src;
const char* dest ;
dest = src;
这样赋值是正确的,因为:
* 操作数指向的都是char类型,因此是相容的
* 左操作数具有有操作数所指向类型的全部限定符(右操作数没有限定符),同时自己有限定符(const)
如果反过来赋值就违反了赋值的约束条件:src指向的对象的值可以修改,而dest指向的对象的值不可修改
如果让src去指向dest所指向的那个不可修改的对象,如果合法,岂不是变得可修改了?
src = dest; // 这样赋值,左操作数指向的类型没有右操作数指向类型的const限定符,不符合约束条件2
而对于const char** 和char**:
const char**的类型是:“指向一个有const限定符的char类型的指针的指针”。
char**的类型是:“指向一个char类型的指针的指针”。
对于const char** 和char**来说,二者都是没有限定符的指针类型,但是它们指向的类型不一样,前者指向char*, 而后者指向const char*,因此它们不相容,所以char**类型的操作数不能赋值给const char**类型的操作数。
即对于下列代码,编译器会报错:char** src;
const char** dest;
dest = src;
// error: invalid conversion from `char**' to `const char**'
4.下列排序需要的空间复杂度最大的是?()
A.冒泡排序 B.快速排序 C.堆排序 D.希尔排序
答案:B
解析:冒泡排序和堆排序需要一个额外的元素来实现交换,希尔排序需要记录增量的一个变量。 快速排序的递归实现则需要一个栈空间来实现递归,平均情况下,需要O(nlgn)的额外空间