总结几道群硕笔试题

2012年04月15日 01:26 阅读 29

I、Knowledge Foundation
1、一道算24的题目,4,4,10,10,+、-、*、/得24。
应该不难,(10*10-4)/4就OK了。
这道题还算好,扩展一下,稍难点的有4,4,7,7,算法是(4-4/7)*7,再难一点:3,3,8,8,算法是8/(3-8/3)=24。其实发现这类题有一个特点,就是一定有“/”,再和括号连用。否则就不会拿来当面试题了。

2、一根不均匀的绳,从头烧到尾要用掉1个小时,如果用若干相同的绳子,问如何烧法能计时1小时15分钟?
这道题是常见的智力题,关键一点是要知道从两头烧,用三根绳就够了。第一根从两头烧起,同时烧第二个的一头,第一根烧完了,30分钟过去了,第二个还剩一半(不是均匀的一半,不过没关系),赶紧烧第二头,烧完了就是45分钟,最后再烧第三根绳子的两头,又是30分钟,刚好凑足1个小时15分钟。

3、用最简单的方法,判断一个无符号整数是不是2的n次幂
我写的是算法是:
int isPower2(unsigned num)
{
int i = 1;
if(num == 0)
return 1;
while(i < num)
i *= 2;
if(i==num)
return 1;
return 0;
}
简单是蛮简单,可是效率就不高了。到网上一查,发现最牛的算法是查该数的二进制表示中,是否只有最高位为1,其余都是0.
int ispow2(int x)
{
return x && !(x & (x-1));
}
这是二进制的位运算了,还有一种写法:
if((n&-n)==n)
returnture;

4、How would you design a coffee-machine for an automobile.List the features of the coffee machine.
这是一道思维题,没标准答案,我也没有,不过我当时想了很久这道题在考我什么。

5、虚拟内存的实现机制
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
如果计算机缺少运行程序或操作所需的随机存取内存 (RAM),则 Windows 使用虚拟内存(Virtual Memory)进行补偿。
虚拟内存主要依据以下3个原则进行工作:
1.在正常使用的时候,系统内部的交换(缓存)文件通常保存在虚拟内存中;
2.自动把非活动的系统进程或者程序映射到虚拟空间;
3.当物理内存低于25%左右的时候,则把虚拟内存和物理内存合并,也就是说系统此时会把你的虚拟内存也识别成物理内存。

6、进程间的通信方式,至少3种
命名和匿名管道 Pipe
信号标 Semaphore
互斥子 Mutex
共享内存 Shared Memory
消息队列 Message Queue
文件系统
CORBA
D-Bus

7、多线程的例子
时钟、聊天系统、操作系统

8、在等概率的情况下查找成功的平均查找长度ASL

ASL=(1+2*2+3*3+4*3+5*2+6*1)/12
= 42/12 = 3.5
若对表中元素先进行排序构成有序表

ASL=(1+2*2+3*4+4*5)/12
= 37/12 = 3.1

9、堆栈的区别
I、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
II、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
III、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 – 程序结束后有系统释放
IV、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
V、程序代码区—存放函数体的二进制代码。
申请方式:
stack:由系统自动分配。例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:需要程序员自己申请,并指明大小,在c中malloc函数
堆和栈的区别可以用如下的比喻来看出:使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

II、General Testing Techniques
10、正面测试、负面测试
负面测试(Negative testing)是相对于正面测试(Positive testing)而言的。它们也是测试设计时的两个非常重要的划分。简单点说,正面测试就是测试系统是否完成了它应该完成的工作;而负面测试就是测试系统是否不执行它不应该完成的操作。形象一点,正面测试就象一个毕恭毕敬的小学生,老师叫我做什么,我就做什么;而负面测试就象一个调皮捣蛋的孩子,你叫我这样做,我偏不这样做,而且和你对着干。开发人员也是最讨厌修改此类bug的。
正面测试主要根据需求,功能说明书,设计文档等相关参考文档来执行测试,而负面测试则主要根据错误猜测,逆向思维来测试系统,一定程序上的的依赖测试人员的经验积累。

III、General Programming Techniques
11、将浮点型转换为字符串
//Java
float f = “1.1″;
String s = “” + f;
//C
gcvt(将浮点型数转换为字符串,取四舍五入)
char *gcvt( double number, size_t ndigits, char *buf );
gcvt()用来将参数number转换成ASCII码字符串,参数ndigits表示显示的位数。gcvt()与ecvt()和fcvt()不同的地方在于,gcvt()所转换后的字符串包含小数点或正负符号。若转换成功,转换后的字符串会放在参数buf指针所指的空间。该函数返回一字符串指针,此地址即为buf指针。
ecvt() :将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点
fcvt():以指定位数为转换精度,其余同ecvt()
#include <stdio.h>
#include <stdlib.h>
int main()
{
double a = 123.45546;
double b = -1234.56;
char ptr[20] = {0};
gcvt( a, 7, ptr );
printf( “a value = %s\n”,ptr );
char *p = gcvt( b, 5, ptr );
printf( “b value = %s\n”,p );
}

上一篇:我的笔经
下一篇:建行笔经 – java
2019年java面试互助交流
扫一扫:共赴好前程
还没有评论!