第二部分:填空题(2*6)
1. 操作系统中的存储管理常用(虚拟存储器)的方式来摆脱主存容量的限制。
2. 满二叉树第i层上的叶子节点数有(2的i-1次方)个。
3. 二分查找算法的平均时间复杂度是(logn)。
4. 设x=3,y=2,x<<y=(12)。
5. 非成员函数应声明为类的(友元函数)才能访问这个类的private成员。
6. 带有(纯虚函数)的类称为抽象类,它只能作为基类来使用。
第三部分:简答题(3*6)
1. 列举你所知道的排序算法和他们的平均时间复杂度。
直接插入排序o(n*n)
希尔排序o(nlogn)
冒泡排序o(n*n)
快速排序o(knlogn)
直接选择排序o(n*n)
堆排序o(nlogn)
归并排序o(nlogn)
2. 列举析构函数与普通类成员函数的不同点。
析构函数无返回类型,前面有标志符~,系统自动调用的。
普通成员函数有返回类型,需要显式调用。
3. 在c++语言中使用宏定义经常会引起一下错误(如少打括号引起表达式值与预期不符等),列举一些可以替代宏定义的方法。
const定义常量
inline函数
typedef定义别名
第四部分:编程题
1. 裴波那絜数列的形式如下: 1 1 2 3 5 8 13……. n,编写一个函数计算数列中第n个元素的值。(5分)
int Fibonax(intn)
{
if(n==1 || n==2)
return 1;
else
return Fibonax(n-1)+Fibonax(n-2);
}
2. 不调用任何系统函数,实现在一个字符串中查找子串的函数,如果包含子串,则返回该子串的位置值。(7分)
int GetCommon(char*s1, char *s2, int loca)
{
int len1 = strlen(s1);
int len2 = strlen(s2);
for(int i = 0; i < len1; i++)
{
if(s1[i] == s2[0])
{
int as = i, bs = 0, count = 1;
while(as + 1 < len1 && bs+ 1 < len2 && s1[++as] == s2[++bs])
count++;
if(count == len2)
{
loca = i;
return loca;
}
}
}
}
3. 用算法实现将一个输入的数字颠倒,要求不调用任何系统函数,也不能将输入数字转换为字符串作为中间过渡。(8分)
方法1:(字符数组,借鉴)
#include <stdio.h>
#include <string.h>
#include <dos.h>
int main()
{
charstr[] = "ABCD1234efgh";
intlength = strlen(str);
char* p1 = str;
char* p2 = str + length - 1;
while(p1< p2)
{
char c = *p1;
*p1 = *p2;
*p2 = c;
++p1;
--p2;
}
printf("strnow is %s\n",str);
system("pause");
return0;
}
方法2:递归或栈
void reverse()
{
stack s;
int x;
while (cin>>x)
{
s.push(x);
}
while (!s.empty())
{
x = s.pop();
cout<<x;
}
}