ibm面试归来

 又一次去ibm了,被鄙视了一塌糊涂。写个笔记,以备下次鄙视。

 

有2个人面试,一个人一台笔记本,他们之间不说话,就是通过笔记本打字交流。

 

首先问了我关于项目的事情,我就开始乱说一堆,其实也没什么好说的,都是些无聊的项目。

 

问好项目开始问语言,我说最熟悉c/c++/C#,java么一般,只是用过,不是很熟悉。

 

他们不问我具体的语言细节,都是问的思想。

 

首先是问的多态,我说了一堆废话,什么有个水果类,又有2个子类苹果和橘子继承了水果类,然后再水果类里面定义个虚函数(virtual)f(),然后苹果类和橘子类各自继承这个虚函数f()。调用的时候用水果类同一调用苹果和橘子的这个方法f(),但是运行时可以调用不同的实现。说了半天最后说了句还算可以的话:就是用同一个接口根据不同的上下文(对象)实现不同的功能。

 

对象说完了他开始问我怎么实现容器类,要求能够识别元素类型。我当时就傻掉了,我平时就是会用容器类,用个泛型容器就可以实现对元素的限制,要我自己实现个泛型容器类不会,所以我就乱说了,肯定不对的,他们好像也很不满意。

 

他们看我好像不行,开始有点没兴趣了,问了个设计模式的问题,要我写个单件类,还好我上周看到过singleton怎么写,于是就写了个简单的,不过还是有很多的问题。

 

写完singleton后,他们看了老半天,不知道是我写的不对还是他们看不懂。

之后开始问算法问题,算法问题不难,先写了个输出全排列的。

从开始学习算法到现在已经写过好几遍全排列了,不过在面试的时候写的最好,算是运气不错。

全排列的思想就是先想2个元素全排列是自己和自己换,自己和别人换就可以了,大于两个元素就是递归。

 

接下来又问了道求和问题

思路是先排序,再用两个指针,一个指头,一个指尾,双向遍历。

之后又问了很多零碎的问题,什么引用计数,什么内存管理,还有很多小的问题。总之面试面得很不好。

 

之后第二天去了笔试,做了一套c++卷子。发觉好多都不懂的。整理以下。

 

首先是关于指针的。c++中所有的指针是保存一个地址,所以如果p是个指针,无论什么类型的,sizeof(p)都是4.但是sizeof(*p)是根据*p的类型来的,如果是char * p那么sizeof(*p) = 1,如果是int *p,则sizeof(*p) = 4,这个对struct和class一样使用。同样的如果有个指针char * p = (char*)malloc(100);,sizeof(*p) = 1,sizeof(p)=4,不要被后面那个malloc(100)给骗了。

当然如果是写的char t[100],那么sizeof(t)=100,因为编译器是知道了100。

 

还有个要注意的,char t[]={‘a’,'b', 'c'};和char * t= "abc";是两个概念,前者是字符数组,没有'/0',后者是字符串,有'/0'。

 

还有很多考关于运算符号优先级的,如int x = 3; x+=x-=x-x;这个结果是x=6,先是做x=x-x,然后是x-=0,再是x+=x。

又如:int z = x^y<<2,应该是先做y<<2在做^操作的。

 

还有很多就是指针指来指去的题目,不难就是要搞脑子的。

 

还有关于继承的问题,如果父类中的函数没有写成virtual则子类继承这个函数是不会有多态效果的,父类的指针只能调用父类的方法。代码如下:

上述代码中,g是个普通函数,没有用virtual定义则子类中的g只是覆盖父类的g,无法实现多态。而f则是多态的。

所以当base调用g时是调用的Base g,但是当Base g调用f时,由于f是多态的,所以是调用Derived的f,所以输出是

base g

derived g

同样的,如果子类有个数据成员和父类同名,两者相互独立,子类可以通过父类名::变量名访问父类里的该变量。

 

这样,输出为:

base a = 10

a = 100

 

还有关于类的静态成员的关系。

简单的说就是类静态函数函数可以访问静态数据成员,但是无法访问普通数据成员。类的普通成员函数可以访问普通数据成员同时可以访问类的静态数据成员。类的构造函数不能是静态的。

 

还有关于构造函数和析构函数的调用顺序,原理是在main之前构造全局对象,在main中构造临时对象,析构顺序和构造顺序相反。

 

还有很多零碎的注意点:

int (*init)(int)这个是正确的。定义了个函数指针变量,名称为init,而typedef int (*init)(int)是定义了一个函数指针类型,可以通过init a来定义函数指针。函数指针的赋值只需将需要的函数名赋给函数指针变量即可,如a = fun;调用的时候直接用a调用而不用fun,起到回调函数的作用。

 

int * p = new(nothrow) int,该语句是正确的,c++用new申请内存如果失败则会抛出异常,如果是用nothrow则可以兼容c语言版本,如果申请不成功,则会返回NULL。

 

int getch这个名称是合法的,我竟然不知道,太挫了。

 

在c++中有个位域的概念如:

 

如a占5位,b占4位,c占2位,用一个short去访问则是访问的00000 00 0010 11111,变成了95.这个还是很搞的。要记住是大端,地字节是存在高地址上的。同样还有对齐的问题,一般以4,16对齐。

 

2分查找,logn次,这里也写下代码以备复习

 

今天就想到这么多了,下次想到在补充,争取下次再有被ibm鄙视的机会。

 

2010 5.14 : 今天同学去华为笔试,有道题挺好

移动了20个字节,换成16进展应该是14,结果应该是0x80000014,我开始搞错了,把8也算上了。

 

今天去了家小公司面试,问了到数据结构的题目,说链表里面怎么判断有没有环的存在。

我想了半天,没有什么好办法,只好说了个最烂的方法,说遍历一遍,把每个节点的地址存下来,每次到个新的节点判断是不是已经存在了,如果是那边就是有环了

 

我是用容器保存节点,以判断是不是有重复节点。那个面试的给了个比较好的方法,就是在节点上加个字段判断保存是不是已经访问过,如果访问过置1,下次如果访问到节点是置1的,表示有环。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值