1
本文原文链接:http://www.shadowtrees.com/blog_detail/?id=28
如需转载请到原文评论注明。

Mark-Down


笔试地点:广州中山大学

题型:4个大题,考试时间2个小时


我去的时候一堆北大和中大的,倍感压力,不过这份题出的真心有水平。。。我真心不是偷题的,我认认真真把会做的做了,才有印象回来写这个回顾的,也当是查缺补漏了。

一、选择题(顺序不计)

1.sizeof计算字节是在什么时候?

答:编译时

2.请问下列哪本书最厚(这题我也是醉了)
A.c++ prime
B.Head First
C.Effective c++
D.windows内核编程

答:应该是c吧  = =其他c++几本都挺厚

3.Linux哪个命令是。。。记不得题目了,反正是这几个命令:

cat 显示整个文件
more 以百分比形式查看文件(会分页)
less 和more差不多
head 从文件头开始查看
tail 尾开始查看文件

4.一个盒子里有5个颜色的小球,小球视为无限多,每个人一次可以从里面拿出2个来,那么问:可以最多多少人来拿小球,可以保证有两个人拿出来的球中有相同颜色?

答:应该是6吧,考虑前五个人拿出的每一对都是同样颜色
(例:A:红红 B:黄黄 C:绿绿 D:白白  E:蓝蓝   那么第六个人,
不管拿到什么颜色都会和其中一个人有同样颜色)

5.死锁是如何产生的?

答:是指两个或两个以上的进程在执行过程中,
由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,
若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态
或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
(等待~关键词)

6.我有20块钱,如果一瓶可乐1块(好便宜= =),两个空瓶子可以换1瓶新可乐,那么请问你最多可以喝到多少瓶?

答:20——>10——>5——>2——>1(这些是兑换的过程)38瓶,
然后5——>2时手头上有一个多的空瓶子,加上最后喝的一瓶可以换多一瓶 +1,
所以是最多39瓶。

7.栈和队列有什么共同点?

答:只允许在端点处删除或插入的顺序表。
堆和队列都是先进先出,栈是先进后出。

还有3题不太记得了。。不过可以能看出,这些知识点考察的基本都是最基础的知识点

二、填空题

1.冒泡排序法的时间复杂度

答:O(n^2)

2.如何用程序判断一个float类型变量x是不是为0

答:这题当时没想到,好像直接用了个if去判断= =,后来觉得自己好sb啊。

if(x>0.0000000 && x< -0.0000000) printf("x是0")

3.在执行main函数之前,编译器会运行什么代码?

答:
(1)设置栈指针
(2)初始化static静态和global全局变量,即data段的内容
(3)将未初始化部分的全局变量赋初值
(4)运行全局构造器,估计是C++中构造函数之类的吧
(5)将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数
(网上google下,有人说是start函数)

4.结构struct定义时默认其成员是_____,类class定义时默认成员为_____.

默认的访问权限不同。struct默认为public ,class默认为private;
默认的继承权限不同。struct的继承默认为public继承,class的继承默认为private继承。

5.TCP在请求连接时进行__次握手,断开时是__次挥手。

答:3 ,4

6.下列IP地址的书写格式正确吗?为什么?

(1)162.21.045.22   对
(2)142.23.274.13   错,子网号不可能大于255
(3)168.51.233.25.55   错,主机号之后没东西了,ip是32 位的只有4段
(4)10001111.41.235.12  错,ip地址要不纯用2进制,要不纯用十进制,
可以用ping来检测该ip无效

三、简答题

1.简述事务的四个特性

事务是控制并发的单位,用户定义操作的一个序列。
A:原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
B:一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
一致性与原子性是密切相关的。
C:隔离性(Isolation)
一个事务的执行不能被其他事务干扰。
D:持续性/永久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

2.DDos是什么?

分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于
客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动
DDoS攻击,从而成倍地提高拒绝服务攻击的威力。

3.用SQL语句编程,有A,B,C三个列,如果A比B大,那么输出A,如果B比C大输出B(不太记得了,也不知道这个题目是什么意思。。。)

4.请简述浅拷贝与深拷贝,c++中的拷贝构造函数是什么拷贝?

在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是
增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深
拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!

当然是深拷贝。

5.当你在浏览器输入cc.163.com ,浏览器会打开网易cc语音的主页,请问这个过程计算机做了些什么?

(这个就是web的工作原理,扯了一堆分层、TCP三次握手之类的东西)
具体可以参考《按下google.com时实际发生了什么》:

https://github.com/skyline75489/what-happens-when-zh_CN

6.Linux哪个命令是查看当前进程

ps查看进程。
最常用的方法是ps aux,然后再通过管道使用grep命令过滤查找特定的进程,
然后再对特定的进程进行操作。
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程。

7.如何编程判断CPU是大端还是小端?

答:明白大端和小端的区别,实现起来就非常简单:

Big-endian是一种大值的一端(序列中更典型值)存在前面(在最小的存储地址)
的顺序。Little-endian是一种小值的一端(序列中较不典型的值)存储在前的
顺序。比如,在Big-endian的电脑中,需要两个字节把十六位数4F52当作4F52
存在存储器中(如果4F存在存储地址1000中,比如说,52将存在1001中)。
在little-endian系统里,将被存为524F(52存在存储地址1000中,比如说,
4F将存在1001中)。
#include <stdio.h>  
int main()  
{
    union ut{  
    short s;  
    char c[2];  
}u;
  
if(sizeof(short) == 2)  
{  
    u.s = 0x0102;  
    if(u.c[0] == 1 && u.c[1] == 2){  
        printf("big enidan/n");
    }
else if(u.c[0] == 2 && u.c[1] == 1){  
    printf("little endian./n");  
  }  
    return 0;  
 }  
}

四、编程题(重头戏)

1、学校有个教务系统,里面有三个表

Student(sno,sname,sex,grade,class)
Teacher(tno,tcourse,tname)
Course(cno,cname,ctime)

用SQL语句作答:
(1)找出选了“计算机编程”课程的同学名字和学号。
(2)找出和“谭维维”同学有关的所有课程
(3)(不太记得了)

2、编写一个简单函数add(a,b) ,目的为了计算a和b的和。
条件:已知a和b都为正整数,不考虑溢出,若a的百位数字为0,那么函数直接输出0;反之则计算两个数的和;例如(a=1001,b=31,那么直接输出0; a=123,b=2,输出125)

答:我当时想的比较复杂。。。

正解:直接用a除以100,再%10:      即(a/100)%10==0

3.写出堆排序的伪代码(如果可以写代码,可以用自己喜欢的语言)
PS:这份卷子可以用c++、java、c或者python写

void HeapAdjust(int array[],int i,int nLength)
{
    int nChild;
    int nTemp;
    for(;2*i+1<nLength;i=nChild)
    {
        //子结点的位置=2*(父结点位置)+1
        nChild=2*i+1;
        //得到子结点中较大的结点
        if(nChild<nLength-1&&array[nChild+1]>array[nChild])++nChild;
        //如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点
        if(array[i]<array[nChild])
        {
            nTemp=array[i];
            array[i]=array[nChild];
            array[nChild]=nTemp; 
        }
        else break; //否则退出循环
    }
}
//堆排序算法
void HeapSort(int array[],int length)
{
    int i;
    //调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素
    //length/2-1是最后一个非叶节点,此处"/"为整除
    for(i=length/2-1;i>=0;--i)
    HeapAdjust(array,i,length);
    //从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素
    for(i=length-1;i>0;--i)
    {
        //把第一个元素和当前的最后一个元素交换,
        //保证当前的最后一个位置的元素都是在现在的这个序列之中最大的
        array[i]=array[0]^array[i];
        array[0]=array[0]^array[i];
        array[i]=array[0]^array[i];
        //不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
        HeapAdjust(array,0,i);
    }
}
int main()
{
    int i;
    int num[]={9,8,7,6,5,4,3,2,1,0};
    HeapSort(num,sizeof(num)/sizeof(int));
    for(i=0;i<sizeof(num)/sizeof(int);i++)
    {
        printf("%d ",num[i]);
    }
    printf("\nok\n");
    return 0;
}

4、(压轴)滑雪问题(动态规划)
大概就是说,例如给你一个二维数组,aryR ,比如 R=5,C=5,里面的元素是从1到R*C的,也就是1到25都有,而且只会出现一次。
eg:
INPUT: R=5,C=5 ,以及二维数组每一个元素(任意导入的,可能是乱序,但是最大数肯定是R*C,最小是1),如下:

1    4    5    6    10
2    3    7    8    13
15   25   20   23   24
21   9    11   14   12
19   18   17   16   22

OUTPUT:(输出该数组的最大滑雪落差)
25
编写程序,输入滑雪的“地图”,给出该地图的最大滑雪落差。

分析:
其实,你可以把上面这个例子的数组这个样子看作是从上到下的俯视图(海拔图),
每一个数视为一个点,数值即是这个点的高度,比如20这个点,上有7,
下有11,左是25,右边是23
如果你要“从20这么高滑雪冲下去”那么肯定要找个比20要低的点吧,
题目规定,你只能从一个点滑倒上下左右四个点的其中一个。例如20,
你只能选择滑到7或者11,那么,例如你滑到了7那么“高”,那么你可以
继续“往下滑”,就是滑倒3,3再到2,2再到1;那么最大滑雪落差就是
20-1+1=19+1=20  (因为你在1后要回到地面,默认+1)
本例子的25就是这样来的:25--->15--->2--->1

(注意:不一定是从最大数值那个高度滑下来可以到达最大落差,因为你可能到了某一个点就没有办法继续“往下”了)
例如:这是个8行 8列的二维数组,如果你选了最大值64,那么你会发现,64滑倒邻点的高度差明显不是最大的。最大的高度差是63--->7--->1

45  52  3    4   22  8   51  13
64  48  56   1   12  9   41  19
4   3   59   63  7   11  15   2

答:考虑动态规划

总结:这份试卷主要考察了操作系统,c++,SQl,Linux,计算机等基础知识,不能说难。但是考察的很全面,就算不进面试。也算学到东西了,最后舍友进了面试,拿了offer后和我一起去了鹅肠


wind3110991
603 声望10 粉丝

菜鸟程序员一个 = 。-