Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7369
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 52
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-07 20:52
个人简介

一条狗

文章分类

全部博文(4)

分类: IT职场

2015-05-17 21:59:35

    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"; 要求完善函数。

点击(此处)折叠或打开

  1. void add(char a[], char b[], char c[])
  2. {
  3.     memset(c, 0, N+1);
  4.     int len_a = strlen(a);
  5.     int len_b = strlen(b);
  6.     int ab_long = len_a > len_b ? len_a : len_b;
  7.     int ab_short = len_a < len_b ? len_a : len_b;
  8.     int carry = 0;
  9.     int temp = 0;

  10.     ab_short--;
  11.     ab_long--;
  12.     while(ab_short != -1)
  13.     {
  14.         if(len_a < len_b)
  15.         {
  16.             temp = a[ab_short] + b[ab_long] - 2 * '0' + carry;
  17.         }
  18.         else
  19.         {
  20.             temp = a[ab_short] + b[ab_long] - 2 * '0' + carry;
  21.         }
  22.         
  23.         if(temp >= 10)
  24.         {
  25.             c[ab_long + 1] = temp - 10 + '0';
  26.             carry = 1;
  27.         }
  28.         else
  29.         {
  30.             c[ab_long + 1] = temp + '0';
  31.             carry = 0;
  32.         }        

  33.         ab_long--;
  34.         ab_short--;
  35.     }

  36.     while(ab_long != -1)
  37.     {
  38.         if(len_a < len_b)
  39.         {
  40.             temp = a[ab_long] - '0' + carry;                
  41.         }
  42.         else
  43.         {
  44.             temp = b[ab_long] - '0' + carry;
  45.         }

  46.         if(temp >= 10)
  47.         {
  48.             c[ab_long + 1] = temp + '0';
  49.             carry = 1;
  50.         }
  51.         else
  52.         {
  53.             c[ab_long + 1] = temp + '0';
  54.             carry = 0;
  55.         }

  56.         ab_long--;
  57.     }

  58.         c[0] = carry + '0';
  59. }
  60. //以上并没有考虑到数据的正负




以下为网上搜集到的宇视笔试题目:

二维数组和指针数组二者的指针以及二级指针的联系与区别。


函数调用的过程:
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) |
0

上一篇:HDUOJ1969 二分法求解最大值

下一篇:没有了

给主人留下些什么吧!~~

hdu李少帅2017-03-10 10:55:42

菇凉:
你最后一个大端模式错了。
大端模式: 大数存在小地址
也就是  0x0000 1010 | 0x0000 0001 | 0x0000 0000| 0x0000 0000
         10                  1           
也就是 2^35+ 2^33 + 2^16 = 42949738496;
不知道这样对不对。