5月13日,星期三,晚上7:30大叔短信通知我笔试开始。此时的我还在上ACM选修课,这一节讲的是母函数。于8:00赶到6教129,HR让我坐在前排参与笔试,并允许我晚几分钟交卷。
先总体上看了一遍试卷,题目类型是判断+选择+填空+编程+趣味逻辑题。比上次应届生补招多了趣味逻辑题,一是天平称重最少需要几次才能辨别出有问题的砝码,二是判断四个人中谁说了真话,谁说了假话。题目难度总体比上次应届生补招要难一个等级。
笔试时间要求是一个小时,从8:00左右开始直到8:40左右,一共做了判断选择和填空,最终还剩两个填空题、一个编程和一个逻辑题。然后HR催着交试卷,这个时候基本上已经乱套了,思维开始混乱,赶紧挑着做了几个题,也就是先做了二分法的逻辑题,后来做编程题,思路虽然有,但是不够清晰,无法立即写出代码。一直拖到8:50左右,也不好意思再耽误他们的时间,于是交了试卷,和HR简单的再聊了几分钟,现在总结一下这场笔试过程中犯得几个错误。
一是迟到。笔试一共就一个小时,题量还比较大,一小时才能马马虎虎做完,甚至做不完,迟到等于给判了自己死刑,一次招聘要经历笔试、技术一面、技术二面、人力面等等,其中任何一轮都不能出差错,否则就有可能与这家公司擦肩而过,如果这次是华为机试,那就可能彻底和自己的梦想说拜拜了。撇开这个时间不说,迟到也严重导致做题慌乱,尤其是收试卷那会儿,思绪根本无法静下来,注意力不能集中,自然而然导致做题的速度下降。而且还坐在前排,不是自己的心理舒适区,没有最佳发挥。
二是准备不足。很明显就算给我完整的一个小时,我也未必能把所有题目做完,原因就在于某些知识点掌握不牢靠(将在文章后面一一列出),如sizeof,strlen,struct 中含有 union 的内存对齐等等,有些平时常用的知识点放在纸上到没了把握。还有就是做题的速度不够快,对于那些掌握的知识点也要推算很长一段时间,花费了很多不必要的时间,所以在笔试前应该把该公司的笔试题刷一刷,给自己定个时间,严格按照笔试要求,做一个模拟,提前熟悉笔试氛围。
三是说话不当。首先在门口的工作人员问我应聘什么岗位,软件工程师脱口而出,但是瞬间想起来宇视好像不是叫这个,可一下又想不起来到底叫什么,后面那个“师”字硬是憋在嘴里半天没说出来。其次是HR说我可以晚几分钟交试卷,我还真是狂妄自大,也太傲娇了,说了句:不用的,我用不了太长时间,谢谢。太鸡巴有信心了吧,等交试卷的时候那脸真是打得啪啪响。也是嘴贱,说句谢谢不就完了吗。再者到8:50的时候,不好再拖时间了,HR说不好意思,我也是心态好,笑着说没事,那就当是一回体验吧,尼玛你到是体验爽了,他们不爽了。还洋洋得意地说起了参加过他们公司应届生的补招笔试,现场比较起了两份试卷的难易程度,还没说完,一个HR直接甩过脸去,另一个就问我:你是不是很喜欢把这样的笔试当成考试的感觉。我操,感觉不对劲啊,这明显话里有话。后面那句话我也是接得精彩啊:我其实是很向往你们公司的。可是现在一想起当时说话时的面部表情就想狂扇自己的脸,笑的也太贱了,要是一本正经地说话,他们就算不相信也会好受点吧,你这一笑明显就是在抖机灵嘛。
好吧,宇视实习生招聘一轮游到此结束。
接下来记录笔试中不会的知识点……
①
char a[] = "12345";
char *b = "12345";
printf("\t%d\t%d\t%\t%d", strlen(a), strlen(b), sizeof(a), sizeof(b));
//answer: 5 5 6 4
sizeof的精辟讲解http://www.cnblogs.com/hpunix/articles/320496.html
②
#pragma pack(2)
union B
{
char a;
short int b[5];
double c;
};
struct C
{
char a;
int b;
char c;
};
struct A
{
char a;
struct C b;
union B c;
char d;
};
#pragma pack
printf("%d\n", sizeof(union B)); //10
printf("%d\n", sizeof(struct A)); //22
③
1e0.5 不是常数,科学计数法用法不对
double a = 3.5e2.1; // e后面小数不行。。
double a = 3.5e; // e后面没有指数也不行。。
int i = 2; double a = 3.5ei; //e后面是变量也不行。。
④
逗号 确实是最低优先级的运算符
⑤
for(;;); 是正确的用法
⑥
内联函数和宏定义的区别于联系
http://blog.csdn.net/gao675597253/article/details/7397373
http://www.cnblogs.com/Braveliu/archive/2013/01/12/2857751.html
简单概括就是:
①在 C程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来象函数。预处理器用复制宏代码的方式代替函数调用,省去了
参数压栈、生成汇编语言的 CALL调用、返回参数、执行return等过程,从而提高了速度。使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应。例如
#define MAX(a, b) a > b ? a : b
②在C++程序中,对于任何内联函数,编译器在符号表里放入函数的声明(包括名字、参数类型、返回值类型)。如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里。在调用一个内联函数时,编译器首先检查调用是否正确(进行类型安全检查,或者进行自动类型转换,当然对所有的函数都一样)。
如果正确,内联函数的代码就会直接替换函数调用,于是省去了函数调用的开销。这个过程与预处理有显著的不同,因为预处理器不能进行类型安全检查,或者进行自动类型转换。假如内联函数是成员函数,对象的地址(this)会被放在合适的地方,这也是预处理器办不到的。
C++ 语言的函数内联机制既具备宏代码的效率,又增加了安全性,而且可以自由操作类的数据成员
合理的内联函数和宏定义都可以提高效率,但都会增加代码量。
⑦两个大数相加。给定函数入口 void add(char a[], char b[], char*c[]);
例如:a[N] = "123450123", b[N] = "1123456789", 则c数组的结果应该为 c[N+1] = "1246906912"; 要求完善函数。
-
void add(char a[], char b[], char c[])
-
{
-
memset(c, 0, N+1);
-
int len_a = strlen(a);
-
int len_b = strlen(b);
-
int ab_long = len_a > len_b ? len_a : len_b;
-
int ab_short = len_a < len_b ? len_a : len_b;
-
int carry = 0;
-
int temp = 0;
-
-
ab_short--;
-
ab_long--;
-
while(ab_short != -1)
-
{
-
if(len_a < len_b)
-
{
-
temp = a[ab_short] + b[ab_long] - 2 * '0' + carry;
-
}
-
else
-
{
-
temp = a[ab_short] + b[ab_long] - 2 * '0' + carry;
-
}
-
-
if(temp >= 10)
-
{
-
c[ab_long + 1] = temp - 10 + '0';
-
carry = 1;
-
}
-
else
-
{
-
c[ab_long + 1] = temp + '0';
-
carry = 0;
-
}
-
-
ab_long--;
-
ab_short--;
-
}
-
-
while(ab_long != -1)
-
{
-
if(len_a < len_b)
-
{
-
temp = a[ab_long] - '0' + carry;
-
}
-
else
-
{
-
temp = b[ab_long] - '0' + carry;
-
}
-
-
if(temp >= 10)
-
{
-
c[ab_long + 1] = temp + '0';
-
carry = 1;
-
}
-
else
-
{
-
c[ab_long + 1] = temp + '0';
-
carry = 0;
-
}
-
-
ab_long--;
-
}
-
-
c[0] = carry + '0';
-
}
-
//以上并没有考虑到数据的正负
以下为网上搜集到的宇视笔试题目:
①
二维数组和指针数组二者的指针以及二级指针的联系与区别。
②
函数调用的过程:
A
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601204.html
B 简单描述下函数的调用过程
1)当执行某函数时,参数自右向左入栈;
func(2, 3, 5);
00B61A9E push 5 //参数入栈
00B61AA0 push 3
00B61AA2 push 2
00B61AA4 call func (0B611EAh)
00B61AA9 add esp,0Ch
2)函数跳转,返回地址(下一条即将执行的指令)入栈,保存主调函数当前的栈信息;
int func(int param1, int param2, int param3)
{
00B61410 push ebp //返回地址入栈???
00B61411 mov ebp,esp
00B61413 sub esp,0E4h
00B61419 push ebx
00B6141A push esi
00B6141B push edi
3)执行函数功能;
4)函数返回,还原到进来时的栈状态;
return var1;
00B61463 mov eax,dword ptr [var1]
}
00B61466 pop edi
00B61467 pop esi
00B61468 pop ebx
00B61469 add esp,0E4h
00B6146F cmp ebp,esp
00B61471 call __RTC_CheckEsp (0B61145h)
00B61476 mov esp,ebp // 释放栈函数空间
00B61478 pop ebp // 还原到进来时的栈状态
00B61479 ret
5)跳转到1保存的下一条要执行的指令处去执行。
00B61476 mov esp,ebp
00B61478 pop ebp
00B61479 ret
③
union data
{
int x;
char y[2];
};
data.y[0] = 10;
data.y[1] = 1;
则data.x = ?;
实际调试过程中如果 data.y[2] 和data.y[3]不赋值的话会出来意想不到的结果 0xcc << 24 + 0xcc << 16 + 1 << 8 + 10 ,
但如果data.y[2] = 0; data.y[3] = 0; 小端存储 data.x = 256 * 1 + 10; 大端存储 data.x = 256 * 10 + 1 = 2561;
阅读(1989) | 评论(1) | 转发(0) |