开始想在csdn上写博客了
今天面试了
自己面试的也不多,主要把自己的失败之处记录下来,算是总结下,免得在同一个地方栽跟头。
从笔试的题来说
自己的不足
对面向对象的基本概念不熟练,特别是继承
对算法不够精通,在纸上写不出代码(可能是老对着机器,用笔还真没感觉)
对多线程和网络编程不够娴熟(我还没毕业,能力有限,也没有接触太多的东西)
面试来说
不敢大胆的说出自己的有点,总是太谦虚了
1.下面程序输出什么结果
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {1,2,3,4,5,6};
int *pA = (int *)((&a) + 1);
int *pB = (int *)(a+1);
printf("%d %d",*(pA-1),*(pB-1));
return 0;
}
答案 6 1
我一直认为&a的值和a的值是一样的,所以加1后的指针也是一样的,没想到啊
引用加1竟然是加一个自身的长度,然后pA再减去一个整型占的内存大小就到了a数组的最后一个元素6了
这题对我来说,就是变态,我也写了8个月代码,还真的没有这样用过。
2.下面程序输入什么
class A
{
public:
A(){}
~A(){cout<<"Destructor A"<<endl;}
};
class B : public A
{
public:
B(){}
~B(){cout<<"Destructor B"<<endl;}
};
int _tmain(int argc, _TCHAR* argv[])
{
B *pB = new B;
A *pA = (A *)pB;
delete pA;
getchar();
return 0;
}
如果把上面类A 的析构函数为虚拟的又将怎么样呢
分析:哎,考察类的虚函数表,以前都从汇编看过类的继承的,这次到傻了,认为虚拟的子类不继承,因为虚拟的嘛
哎 哎 这么简单的题都被我刚好弄反了,其实想一下类的虚函数表,就知道了,好久不做题,还真不行啊。而且在小公司里,都很少用自己设计的继承,太悲剧啦。
3.从字符串中找出字字符串的位置。
这个算法都看过好几遍了,可是我就是写不出来,还有改进的算法的空间和时间复杂度我都分析过,可就是不能够在纸上写代码。
4.判断题
switch语句中default的顺序可以随便,但是为了编程风格,一般将default写在最后。
我直接把这个题咔嚓啦,问了一个不做开发的同学,他都说他都知道顺序都是可以互换了。太悲哀啦。
5.斐波那契数列的问题
求第n个斐波那契数列的值,要从时间和空间复杂度上考虑。
我直接写了个递归,明智不对,还是要写。
回来在网上找了一个算法,感觉自己简直是笨蛋了家。
fibonacci 数列定义:
n = 1,2 时,fib(n) = 1
n > 2 时,fib(n) = fib(n-2) + fib(n-1)
如果用递归计算则包含非常多的重复计算量,因此不可考虑。
换一个思路,只要从 f(1) 计算到 f(n-1),那么这个过程是不会有重复计算的。
很多算法用了数组来保存 f(1)到 f(n) 的值,如果 n 很大,则这个空间开销会很大,好处是在需要计算很多个 f(n) 的时候可以利用“缓存”。
如果仅需要计算一个 f(n) 值,就没必要分配这个数组。可以两个临时变量搞定,分别保存 f(n-2),f(n-1)的值。
代码:
这个算法的空间复杂度为 O(1).
时间复杂度为 O(n).
哎,多么好的算法,好像以前也见过,可惜,好久,在小公司里从来都不考虑这些问题。脑子都钝了。
今天面试两家 易思博 和 中软国际 两个都是主要做华为的外包。易思博的直接谈定了,中软国际的还要复试。
哎,我真应该做对的,看看我现在是多么的烂啊。
总结,继续努力。