创新工场2011年校园招聘笔试题

http://hi.baidu.com/g882/blog/item/5142211f3d1d2efae0fe0b94.html


1

#include <stdio.h>

union

{

       int i;

       char x[2];

}a;

void main(){

    a.x[0]=10;

       a.x[1]=1;

       printf("%d",a.i);

}

运行结果:266

3、路由器与交换机的区别:

4、进程与线程的差别

A、操作系统只调度进程,不调度线程

B、线程共享内存地址空间,进程不共享

C、线程间可以共享内存数据,但进程不可以

D、进程间可以通过IPC通信,但线程不可以

5、下面排序算法的时间复杂度不是nlogn的是

二分法插入排序    快速排序    归并排序   堆排序

6、字符串匹配

void getnext(char *s,int next[])

{

       int i,j;

       i=0;j=-1;next[0]=-1;

       while(s[i]){

              if( ?){

                 ++i;++j;next[i]=j;

              }

              else ?

       }

}

int kmp(char *m,char *s,int next[]){

    int i,j;

       i=0;j=0;

       while(m[i]){

              if(j==-1||m[i]==s[j]){

                     ++i;++j;

                     if(s[j]=='\0')

                            return ?;

              }

              else

                     j=next[j];

       }

       return -1;

}

7、某工作有5道工序,某个工作不能在最后做,请问有多少种工作情况

8、内存中有3页,初始为空,页面走向为4,3,2,1,4,3,5,4,3,2,1,5,分别使用先进先出,最近最少使用,理想页面置换算法,请问缺页次数是多少?

10,9,8 9,10,8 10,9,7 9,10,7

9TCP具有但UDP不具有的特点不包括:

A、对上层应用而言,收到数据包的顺序与对方发送的顺序一致

B、源IP、目的IP均相同的数据包经过同样的路由路径

C、传输过程中个别数据包丢失,接收端存在检测机制

D、传输数据前必须使用握手方式建立连接

10

#include <stdio.h>

int func(int n)

{

       if(n==0)

              return 3;

       else

              return (func(n-2)+func(n-1));

}

void main(){

    printf("%d\n",func(13));

}

运行结果:无结果

11、括号匹配的检验

#include <stdio.h>

#include <stdlib.h>

#define TRUE 1

#define FALSE 0

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

typedef int Status;

typedef char SElemType;

typedef struct

{

       SElemType *base,*top;

       int stacksize;

}SqStack;

Status InitStack(SqStack &S)

{

       S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));

       if(!S.base)return FALSE;

       S.top=S.base;

       S.stacksize=STACK_INIT_SIZE;

       return TRUE;

}

Status Push(SqStack &S,SElemType e)

{

       if(S.top-S.base>=S.stacksize)

       {

              S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));

              if(!S.base)return FALSE;

              S.top=S.base+S.stacksize;

              S.stacksize+=STACKINCREMENT;

       }

    *(S.top++)=e;

       return TRUE;

}

Status Pop(SqStack &S,SElemType &e)

{

       if(S.top==S.base)return FALSE;

       e=*(--S.top);

       return TRUE;

}

Status Cmp(SElemType a,SElemType b)

{

       if(a-b==1)return TRUE;

       else if(a-b==2)return TRUE;

       else return FALSE;

}

Status Check()

{

       SqStack S;

       SElemType ch,e;

       InitStack(S);

       while((ch=getchar())!='\n')

       {

              if(ch=='('||ch=='['||ch=='{')Push(S,ch);

              else if(ch==')'||ch==']'||ch=='}')

              {

                     if(!Pop(S,e))return FALSE;

                     if(!Cmp(ch,e))return FALSE;

              }

       }

       if(S.top==S.base)return TRUE;

       return FALSE;

}

void main()

{

       printf("括号匹配的检验\n\n请输入括号:");

       if(Check())printf("正确!");

       else printf("错误!");

}


======

http://blog.csdn.net/liyzh_inspur/article/details/2972381


 第一题:
#include <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266

解析:

C语言中的联合体(UNION)的概念是,联合体中的多种数据类型共享同一个内存空间。就拿你举的例子来说: 
     在联合体a中定义了两种数据类型,字符数组x以及整形变量i.其中整形变量是16位的,数组大小为2的字符数组为8X2=16位。如此一来,编译器便会为联合体a在内存中开辟一个16位的空间,这个空间里存储联合体的数据,但是这个空间只有16位,它既是整形变量的数据,也是字符数组的数据。如果你的程序从字符数组的角度解析这个空间,那么它就是两个字符,如果你的程序从整型的角度解析这个空间,那么它就是一个整数。
     以你的程序为例子,现在已经开辟了一个16位的空间,然后我们假定现在空间还没有被赋值,为:
     00000000 00000000
    那么在运行完代码
    a.x[0] = 10;
    a.x[1] = 1;
    之后,16位的空间变为:
     00001100 00000001
    然后程序运行
    printf("%d",a.i);
    就是把联合体a当成一个整数来解析,而不是字符串数组。那么这样一来,程序就把这16位变成了一个完整的整数:
    (00000001 00001100)二进制 = (266)十进制
    注意,你可以看到程序在把16位弄成整数的时候把后面八位放在了前面,前面八位放在了后面。这个反序是计算机存储结构造成的,这个和联合体没有直接关系。如果感兴趣的话可以参考汇编语言。
    就是这个道理。


第二题:
main()
{
union{ /*定义一个联合*/
int i;
struct{ /*在联合中定义一个结构*/
char first;
char second;
}half;
}number;
number.i=0x4241; /*联合成员赋值*/
printf("%c%c/n", number.half.first, mumber.half.second);
number.half.first='a'; /*联合中结构成员赋值*/
number.half.second='b';
printf("%x/n", number.i);
getch();
}
答案: AB

解析:


  • 黄小非
  • 等级:
发表于:2008-03-30 15:48:125楼 得分:0
第二个例子同样,
union{ /*定义一个联合*/
    int i;
    struct{ /*在联合中定义一个结构*/
        char first;
        char second;
    }half;
}number;

定义了联合体number,这个联合体有两种数据类型,整形i(16位),以及一个结构体(struct half)(2个char,16位)。所以编译器为这个联合体开辟一个16位的空间:
00000000 00000000
然后赋值:
number.i=0x4241;
这个时候,联合体以整形的身份出现,16位的空间将被整体认为是一个整数赋值。
注意(0x4241)(16进制) = (01000010 01000001)二进制。还记得刚才说的,计算机存储的时候是反着存的吗,先存低位,再存高位(参考汇编语言),因此16位地址被赋值位
01000001 01000010
然后
printf("%c%c/n", number.half.first, mumber.half.second);
实际上是把16位空间以结构体half的角度解析,也就是两个char.
那么第一个:number.half.first = (01000001)二进制 = (65)十进制 = A(ASCII码)
同理number.half.second = B(ASCII码)
当然后头又给first和second赋值位"a"和"b",这样会把16位空间弄成是:
01100001 01100010
然后用
printf("%x/n", number.i);
就是把16位看成整数,记住高地位反过来
(01100010 01100001)二进制 =   (0X6261)16进制
所以结果就是:0x6261.

getch();
最后记得按任意键结束程序。
=======================



你可能感兴趣的:(汇编,struct,招聘,存储,语言,编译器)