51CTO下载-C程序员面试题

2021-09-24 17:19

挺好的 程序员可以用哈

一:推理题。

1、 一个大院子里住了50户人家,每家都养了一条狗,有一天他们接到通知说院子里有狗生病了,并要求所有主人在发现自己家狗生病的当天就要把狗枪杀掉。然而所有主人和他们的狗都不能够离开自己的房子,主人与主人之间也不能通过任何方式进行沟通,他们能做的只是通过窗户观察别人家的狗是否生病从而判断自己的狗病否。(就是说,每个主人只能看出其他49家的狗是不是生病,单独看自己的狗是看不出来的)

第一天没有枪声,第二天还是没有枪声,第三天传出一阵枪声,问有多少条狗被枪杀。

2、有四个人(A,B,C和D)要在一个月黑风高的夜里过一个很长的独木桥。桥只能一次乘载两个人,就是说每次最多两人同时过桥。过桥要用手电筒,而这四个人只有一只手电筒,也就是说两人共用这只手电筒过桥后,其中一人必须带着手电筒返回(没有其他方法),否则其他人就不能再过了。这四个人由于年龄和身体状况的差异,每个人过桥所需要的时间不同:A需要1分钟,B需要2分钟,C需要5分钟,D需要10分钟。由于共用一只手电筒的原因,当两人一同过桥时,过桥的时间是以其中慢的一人为准,比如A和C一起过桥要用5分钟。

现在问:要所有人过桥,最短要多少分钟,如何安排他们的过桥顺序?

二:编程题

1,

用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。

2

用C语言实现函数void * memmove(void *dest,const void *src,size_t n)。memmove函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。

3

用两个栈实现一个队列的功能?要求给出算法和思路!

4

已知链表的头结点head,写一个函数把这个链表逆序 void reverse(node*& head)

5

写一个函数找出一个整数数组中,第二大的数 int find_sec_max( int data[] , int count)

挺好的 程序员可以用哈

已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy。

三:找错题

11

void test1()

{

char string[10];

char* str1 = "0123456789";

strcpy( string, str1 );

}

2:

void test2()

{

char string[10], str1[10];

int i;

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

{

str1[i] = 'a';

}

strcpy( string, str1 );

}

3:

void test3(char* str1)

{

char string[10];

if( strlen( str1 ) <= 10 )

{

strcpy( string, str1 );

}

}

试题4:

void GetMemory( char *p )

{

p = (char *) malloc( 100 );

}

挺好的 程序员可以用哈

void Test( void )

{

char *str = NULL;

GetMemory( str );

strcpy( str, "hello world" );

printf( str );

}

试题5:

char *GetMemory( void )

{

char p[] = "hello world";

return p;

}

void Test( void )

{

char *str = NULL;

str = GetMemory();

printf( str );

}

试题6:

void GetMemory( char **p, int num )

{

*p = (char *) malloc( num );

}

void Test( void )

{

char *str = NULL;

GetMemory( &str, 100 );

strcpy( str, "hello" );

printf( str );

}

试题7:

void Test( void )

{

char *str = (char *) malloc( 100 );

strcpy( str, "hello" );

free( str );

... //省略的其它语句

挺好的 程序员可以用哈

}

编程题

答案1

char *revert(char * str)

{

int n=strlen(str);

int i=0;

char c;

for(i=0;i

{

c=str;

str=str[n-i];

str[n-i]=c;

}

return str;

}

答案2

void * memmove(void *dest,const void *src,size_t n)

{

assert((dest!=0)&&(src!=0));

char * temp=(char * )dest;

char * ss=(char * )src;

int i=0;

for(;i{

*temp++=*ss++;

}

return temp;

}

答案3

设2个栈为A,B, 一开始均为空.

入队:

将新元素push入栈A;

出队:

挺好的 程序员可以用哈

1将栈A中所有元素依次pop出并push到栈B;

2将栈B的栈顶元素pop出;

答案4

void reverse(node*& head)

{

if ( (head == 0) || (head->next == 0) ) return;// 边界检测

node* pNext = 0;

node* pPrev = head;// 保存链表头节点

node* pCur = head->next;// 获取当前节点

while (pCur != 0)

{

pNext = pCur->next;// 将下一个节点保存下来

pCur->next = pPrev;// 将当前节点的下一节点置为前节点

pPrev = pCur;// 将当前节点保存为前一节点

pCur = pNext;// 将当前节点置为下一节点

}

}

链表正常的顺序是前一个节点的NEXT指向后一个节点。反转就是要将后一个节点的next指向前一个节点所以pCur->next = pprev; 完成了这一个功能。但这只是完成了两个节点的反转,所以对应的要将当前

节点的next保存下来pNext = pcur->next;,用来当作下一次的当前节点PCur = Pnext;在下一次反转中,当前节点就变成了下一次反转中的前节点。pPrev = pCur;一直到当前节点为NULL,也就是全部转化为止;

6

char *strcpy(char *strDest, const char *strSrc)

{

if ( strDest == NULL || strSrc == NULL)

51CTO下载-C程序员面试题.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:弘德语言文化培训学校2011年管理岗位培训

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: