zoukankan      html  css  js  c++  java
  • 【笔试】T实习生2014 总结

     

        2014.4.12 是T的广州站,就在本校,很方便。考前一两天,临时抱佛脚,看着HTMLdog上的网页知识。就算考前,还在懊悔自己为什么不好好利用清明假期,多看点,看多点?哎,哎。。

     

        谁知道一拿到试卷就傻眼了,原来考基础的知识,这几乎都木有怎么准备啊。是老天爷给我苟延残喘的时间吧。好吧,只能靠着零碎的记忆,硬着头皮做了。

     

        我的基础还打得不够踏实,很多知识都似懂非懂呢。It is my chance .It is my challenge.

     

     

     


     

     

     


     

     一.C++

     

     

     

    1.sizeof() 32位机

     

     

     

      • sizeof(指针)=sizeof(*char)=sizeof( (char*)malloc(100) )=4 byte
      • sizeof(char a[]="123456")

    字符数组,最初未指定大小,由具体填充值定。6个显性字节,加隐含的"",共7byte

    • sizeof(char a[]="a ")=3, 算1位

     

     

     

    • sizeof(char a[100])=4,a[]等价于*a,退化成指针?
    • sizeof(char a[100]="123456")
    字符数组,开始预分配100,∴共100,
    strlen(a)=6,退化为char* 指针,以""结束

     

    • sizeof(int a[100])=400

     

    • 结构体的长度一定是最长数据元素的整数倍(以其为对齐单元),结构体对齐参数默认为8

     

    • eg
    int* a[3][4];
    //这个二维数组布局是这样的
    //[0] x, x, x, x
    //[1] x, x, x, x
    //[2] x, x, x, x

    //这是整个二维数组的大小
    // 3*4*sizeof(int*) = 3*4*4 = 48
    assert( sizeof(a)==48 );

    //*a取的是二维数组的第1行的指针,每行有4个int*,则大小为
    // 4 x sizeof(int*) = 4 * 4 = 16
    assert( sizeof(*a)==16 );

    //**a取的是第1行的第1列的指针
    // sizeof(int*) = 4
    assert( sizeof(**a) == 4 );

    //***a取的是第1行第1列的内容,即int指针的内容,则
    // sizeof(int) = 4
    assert( sizeof(***a) == 4 );

     

    • eg int **a[3][4], sizeof(a)=3*4*4=18
    []运算符的结合性大于*,变量定义要从右往左读,∴int** a[3][4]应该解释为:有一个3*4的数组,它的名字叫a,每个元素的类型是int**。

     

    2.malloc 销毁

     

    • malloc与free是C++/C 语言的标准库函数,不在编译器控制权限之内,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成“构造”与“析构”。

     

    对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。

     

    Malloc 向系统申请分配指定size个字节的内存空间,从堆里面获得内存空间函数返回的指针是指向堆里面的一块内存,返回类型是 void* 类型,void* 类型可以强制转换为任何其它类型的指针。

     

    int *p = (int *) malloc(sizeof(int) * length);

     

    malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数

     

    void free(void *FirstByte): free()释放的是指针指向的内存(将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。)指针仍然指向原来的存储空间,指针指向的内容变成垃圾,释放内存后把指针指向NULL

     

    • new/delete 是C++的运算符

     

    动态对象的内存管理,

     

    3.C++中,内存分成5个区,堆、栈、自由存储区、全局/静态存储区、常量存储区

     

    栈,由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区,通常是局部变量、函数参数等。

     

    堆,由new分配的内存块,编译器不去管它们的释放,由我们的应用程序去控制,一般一个new就要对应一个delete。

     

    如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

     

    自由存储区,由malloc等分配的内存块,和堆相似,用free来结束自己的生命

     

    全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区(未初始化的变量都被初始化成0或空串,C中也一样)。

     

    常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)

     

    void f() { int* p=new int[5]; }

     

    在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中

     

    http://www.cnblogs.com/hanyonglu/archive/2011/04/12/2014212.html

     

    堆和栈主要的区别:

     

    1、管理方式:栈,由编译器自动管理;堆,由程序员控制,易memory leak。

     

    2、空间大小:栈,一般都是有一定的空间大小(VC6 1M 可改);堆,32位机的4G

     

    3、能否产生碎片:栈无,堆有

     

    4、生长方向:栈,向下生长,朝内存地址减小方向;堆,向上,内存地址增大方向

     

    5、分配方式:栈,静态分配-编译器,动态分配-alloca函数;堆,动态

     

    6、分配效率:栈是机器系统提供的数据结构,so效率比较高;堆,C/C++函数库提供,按照一定的算法,在堆内存中搜索可用的足够大小的空间。效率低

     

    so 尽量用栈,而不是用堆

     

    static

     

    静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员)。类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配

     

    static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,

     

    3.指针 (写个程序验证下吧)

     

    指针值赋予 

     


     

     二.数据结构

     

    判断单链表是否有环算法,至少需多少个指针?

     

    快慢追赶

     

    1. bool I***itsLoop(slist * head)
    2. {
    3.     slist * slow = head , * fast = head;
    4.     while ( fast && fast -> next ) 
    5.     {
    6.         slow = slow -> next;
    7.         fast = fast -> next -> next;
    8.         if ( slow == fast ) break ;
    9.     }
    10.     return ! (fast == NULL || fast -> next == NULL);
    11. }

     

    2.二叉树

     


     

     三.数据库(看课本。。)

     

    1.关系模式的定义&判断

     

    1-NF(第一范式)每列都是不可再分的原子=R的所有属性都是不可再分的原子属性

     

    2-NF:关系模式R为1-NF,R中每个非主属性都完全依赖于R的某个候选关键字/主键(真子集)=确保每列和主键相关

     

    数据冗余 插入删除更新异常

     

    3-NF:R为2NF,且R中每个非主属性都不传递依赖于R的某个候选关键字=确保每列和主键直接相关,而不是间接相关=属性不依赖于其它非主属性

     

    BCNF;鲍依斯-科得范式,是3NF的改进形式 。在第三范式的基础上,不存在任何字段对任一候选关键字段的传递函数依赖。不会有关键字段决定关键字段

     

    插入删除更新异常

     

    4-NF:限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖

     

     

    要求越来越严格,要符合某一种范式必须也满足它前边的所有范式

     

    2.以下find表达方式一样的?

     


     

    四.软件工程(参照:http://blog.csdn.net/zhengzhb/article/category/926691/2 

     

    设计模式:Observation  visited

     

    观察者模式:对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。类型:行为类模式

     


     

     五.计算机网络(看书!)

     

    1.C类,三个子网,每个子网55个主机,每个子网掩码?

     

     (子网地址)网络号:该网段的首个地址(定义:将IP地址和子网掩码进行与运算得出的结果为网络号)主机位全0

     

    广播地址:该网段的最后一个地址 主机位全1

     

             1、 /25

     

                    128的掩码;1位1,7位0(10000000);块尺寸为128;2个子网,每个子网中有126个主机号。

     

             2、 /26

     

                    192的掩码;2位1,6位0(11000000);块尺寸为64;4个子网,每个子网中有62个主机号。 

     

             3、 /27 

     

                    224的掩码;3位1,5位0(11100000);块尺寸为32;8个子网,每个子网中有30个主机号。 

     

             4、 /28

     

                    240的掩码;4位1,4位0(11110000);块尺寸为16;16个子网,每个子网中有14个主机号。

     

             5、 /29

     

                    248的掩码;5位1,3位0(11111000);块尺寸为8;32个子网,每个子网中有6个主机号。 

     

             6、 /30

     

                    252的掩码;6位1,2位0(11111100);块尺寸为4;64个子网,每个子网中有2个主机号。

     

    2.指定端口的网络协议?TCP/UDP not ICMP/IP 

     


     

     六.操作系统(看书总结)

     

    1.给定资源,至多几个进程同时请求竞争 才避免死锁?

     

    2.缺页中断,调度算法?

     

     LRU

     

    3.磁盘指针划道数?

     


     

     七.计组(看书!)

     

     (中央)处理器CPU(Central Processing Unit):

     

    运算器ALU(Arithmetic and Logic

     

    Unit):算术逻辑部件,通用寄存器组,状态寄存器

     

    控制器CU:时令 时序 总线控制逻辑 中断控制逻辑

     

    存储器

     


     

     八.算法(看书看资料!)

     

     1.空间复杂度 & 时间复杂度 计算&比较

     

     f函数T(n)为O(n),f*f 时间复杂度为O(n*n) or O(n)?

     

    quick sort 至少占S(n)为O(1)?

     

    lim(T(n)/f(n)) = 不为0常数

     

     T(n)=O(f(n)),

     

     复杂度与时间效率的关系:

     

    c < log2n < n < n*log2n < n2 < n3 < 2n < 3n < n! (c是一个常量)
    |--------------------------|------------|-------------|
              较好                     一般              较差

     

    2.排序

     

    直接插入法:一个数据插入到已经排好序的有序数据中,O(n^2),稳定

     

     

     就地排序,所以空间复杂度是O(1),稳定

     

    插入排序有个升级版:二分插入法:减少了关键字之间比较的次数,记录移动的次数没有变,时间复杂度仍为O(n^2),在插入Ri个元素的时候采用二分法比较查找插入位置,稳定

     

    在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们
    中间的那个元素比,如果小,则对前半再进行折半,否则对后半
    进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间
    的所有元素后移,再把第i个元素放在目标位置上。

     

    冒泡n2

     

    冒泡改进:快排 不稳定 nlog2n

     

    合并

     

    关键字比较次数与原始数据排序关系?

     

    排序前后的相同数字的顺序是否改变=是否稳定?

     


     

     九.附加题

     

    1分,2分,4分,组成1元的方案为?

     

    参考http://www.zhihu.com/question/21075235

     

    称重小于41g,要4个砝码,分别为?

     

    参考http://blog.csdn.net/livelylittlefish/article/details/3854702

     

     

     

  • 相关阅读:
    厂商前缀
    文本阴影和边框阴影
    2D转换
    overflow属性
    margin属性
    CSS圆角边框
    浮动定位
    文档流定位
    position属性
    选择器二
  • 原文地址:https://www.cnblogs.com/yzhen/p/3661884.html
Copyright © 2011-2022 走看看