[普通]《ASCE1885的IT笔试面试题》---0000 0003

作者(passion) 阅读(1001次) 评论(0) 分类( 面试题)

绝对是《2010网易游戏实习生招聘游戏开发工程师》的试题(by ASCE1885,有的答案以后再加咯)

一、基础知识部分

1)已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历是________(4分)

解答:DGEBHFCA

 

2)在一个单链表HL中,若要在指针q所指的节点后面插入一个由指针p所指向的节点,则执行()(2分)

A. q->next=p->next; p->next=q;                       B. p->next=q->next; q=p;

C. q->next=p->next; p=q;                D.p->next=q->next; q->next=p;

解答:D

 

3)栈S最多容纳4个元素,现在6个元素按A、B、C、D、E、F顺序进栈,下列哪一个序列是不可能出现的出栈序列?()(2分)

A. CDBFEA               B. AFEDCB                C. ABCDEF               D. CBEDAF

解答:B

 

4)有以下定义:char s[20]=programming,*ps=s;则不能代表字符o的表达式是:()(2分)

A. ps+2             B. s[2]               C. ps[2]            D. ps += 2, *ps

解答:A,是指针。

 

5)1 请说明以下局部变量、全局变量和静态变量的区别?(3分)

   2 局部变量是否可以和全局变量同名?(1分)

解答:1 :

从作用域看:

全局变量具有全局作用域,全局变量只需在一个源文件中定义,就可以作用于所有的源文件,当然,在不包含该全局变量定义的源文件需要使用extern关键字再次声明这个全局变量;

静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有函数可见,而静态句柄变量只对定义它的函数体始终可见;

局部变量也是局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在的,而是只在函数执行期间存在,函数的一次调用执行结束后,局部变量被撤销,其所占用的内存也被回收;

静态全局变量具有全局作用域,它和全局变量的区别在于如果程序包含多个文件的话,它仅作用于定义它的文件中,即被static关键字修饰过的全局变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量,且不会冲突。

从分配内存空间看:

全局变量、静态局部变量、静态全局变量都是在静态存储区中分配空间的;而局部变量是在栈里分配空间的。

 

2

局部变量和全局变量可以同名,在函数内引用这个变量时,会优先使用局部变量,而不是全局变量,要明确调用全局变量时,可以在这个变量名前加全局作用符:::

 

6)请简述链表和数组的区别和优缺点?

解答:1)数组是顺序存储的,元素在内存空间中一般是连续的;而链表元素间则是一种随机的状态,不一定是顺序连续的;2)数组一旦显式声明后,其大小是固定的,不能动态扩充;而链表可以动态添加节点元素;3)链表的插入删除操作简单,不需要移动元素的位置,但它不支持索引操作,要访问某个元素需要遍历链表进行查找;数组支持索引操作,可直接定位到第几个元素位置处,但数组的插入和删除操作时间和空间耗费大,一般需要移动元素的位置。

 

二、代码阅读

1)下面算法复杂度是:______________(3分)

long int integer_exp(int d, int e)

{

         long int t;

         if(!e)         t=1;

         else

         {

                   t = integer_exp(d, e/2);

                   t = t*t;

                   if(e%2 != 0)

                            t = t*d;

         }

         return t;

}

 

2)请找出下面程序的错误(尽可能多找错误)(7分)

#include <stdio.h>

struct String

{

         char* buffer;

         unsigned long size;

};

 

void resize(String* str, int size)   

{

         char *tempbuffer = new char[size];

         if(str->buffer != 0)

         {

                   if(size > str->size)

                   {

                            size = str->size;

                   }

 

                   for(int i=0; i<size; ++i)

                   {

                            tempbuffer[i] = str->buffer[i];

                  }

         }

 

         str->buffer = tempbuffer;

         str->size = size;

}

 

void copy(String* a, String* b)

{

         resize(a, b->size);

 

         for(int i=0; i<b->size; ++i)

         {

                   a->buffer[i] = b->buffer[i];

         }

}

 

int main(int argc, char* argv[])

{

         String a;

         resize(&a, 3);

         a.buffer[0] = 'a';

         a.buffer[1] = 'b';

         a.buffer[2] = 'c';

         String b;

         copy(&b, &a);

 

         printf("%s %s", a.buffer, b.buffer);

}

 

解答:正确的代码如下:

#include <stdio.h>

#include <assert.h>     //加头文件:#include<assert.h>

 

struct String

{

         char* buffer;

         unsigned long size;

};

 

void resize(String* str, int size)

{

    assert(str != NULL); //加一句断言是否为空

         char *tempbuffer = new char[size+1]; //将数组大小再加1,用于存放结束标志/0

         if(str->buffer != NULL) //改为标准指针判断非空:!=NULL

         {

                   if(size > str->size)

                   {

                            str->size = size; //顺序相反了

                   }

                  

                   int i; //独立到外面来

                   for(i=0; i<size; ++i)

                   {

                            tempbuffer[i] = str->buffer[i];

                   }

                   tempbuffer[i] = '/0'//加个字符数组结束符

         }

 

         str->buffer = tempbuffer;

         str->size = size;

}

 

void copy(String* a, String* b)

{

         resize(a, b->size);

 

         for(int i=0; i<b->size; ++i)

         {

                   a->buffer[i] = b->buffer[i];

         }

}

 

int main(int argc, char* argv[])

{

         String a;

         a.buffer = new char[1]; //需分配一个空间,后面再调整大小

         resize(&a, 3);

         a.buffer[0] = 'a';

         a.buffer[1] = 'b';

         a.buffer[2] = 'c';

         String b;

         b.buffer = new char[1]; //需分配一个空间,后面再调整大小

         copy(&b, &a);

 

         printf("%s %s", a.buffer, b.buffer);

        

         return 0; //加个返回值

}

 

 

3)下列程序func(9)的输出结果是:____7_____(2分)

int func(int x)

{

         if(x == 0 || x == 1)

                   return 3;

         return x-func(x-2);

}

 

4)sizeof(char),sizeof(int),sizeof(float),sizeof(doube*)的值分别是:__1___4___4___4___(2分)

 

5)const char *p和char* const p和char const *p的区别是什么?(3分)

解答:const char *p是指向常量的指针;

         char* const p是指向常量的指针,同上;

         char const *p是指向非常量的指针常量。

 

三、编码相关

1)用自己熟悉的语言写代码或伪代码计算出以输入的任意长度字符串中不同的字符以及它的个数(区分大小写)(15分)

 

2)15分

1、请给出一个单链表结构的定义,每个节点用来储存一个整型数,并且给出一段代码来合并两个已经按照该整数从小到大排好序的链表,使得合并后的链表也是同样排好序的。

2、再写出一段代码把这个单链表改成双向循环链表(可以假设刚才的节点成员还有一个pre的指针)

 

3)15分

史密斯住在第十三号大街,这条大街上的房子的编号是从13号到1300号。琼斯想知道史密斯所住的房子的号码。

琼斯问道:它小于500吗?史密斯作了答复,但他讲了谎话;

琼斯问道:它是个平方数吗?史密斯作了答复,但没有说真话;

琼斯问道:它是个立方数吗?史密斯回答了并讲了真话;

琼斯说道:如果我知道第二位数是否是1,我就能告诉你那所房子的号码;

史密斯告诉了他第二位数是否是1,琼斯也讲了他所认为的号码。

但是,琼斯说错了。

史密斯住的房子是几号?

 

4)20分

在一个4*4方格线上,1只蚂蚁从A点出发,沿着方格线爬到B点,如下图所示,规定每次只能向右或向上爬,问:

1. 从A到B有多少条不同的路线?

2. 如果把方格线扩展为n*m,则又有多少条不同的路线?

3. 突然天降暴雨,洪水冲断了s条线段

假如蚂蚁可以朝任意方向爬了,被洪水冲断的线段是随机位置的,请写出程序代码

输入:一串下列结构的链表,每个节点表示x1y1到x2y2的路线是被洪水冲断的

typedef struct broken_road_s

{

         struct broken_road_s *next;

         int x1;

         int y1;

         int x2;

         int y2;

}broken_road_t;

输出为蚂蚁从起点到终点的路径链表,如果不可达输出为0(请自己设计输出的结构体)

                                                                             B

















                               A


« 上一篇:wifi共享上网(至尊版wifi)
« 下一篇:drcom至尊版使用openwrt路由器拨号
在这里写下您精彩的评论
  • 微信

  • QQ

  • 支付宝

返回首页
返回首页 img
返回顶部~
返回顶部 img