您的位置:知识库 » 求职面试

yahoo在线笔试题(c语言)及部分答案

发布时间: 2009-11-20 19:18  阅读: 5821 次  推荐: 0   [收藏]  

判断一个字符串是不是回文

int IsReverseStr(char *aStr)
{
int i,j;
int found=1;
if(aStr==NULL)
return -1;
j
=strlen(aStr);
for(i=0;i<j/2;i++)
if(*(aStr+i)!=*(aStr+j-i-1))
{
found
=0;
break;
}
return found;
}

Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。

数组实现:

#include <stdio.h>
#include
<malloc.h>
int Josephu(int n, int m)
{
int flag, i, j = 0;
int *arr = (int *)malloc(n * sizeof(int));
for (i = 0; i < n; ++i)
arr[i]
= 1;
for (i = 1; i < n; ++i)
{
flag
= 0;
while (flag < m)
{
if (j == n)
j
= 0;
if (arr[j])
++flag;
++j;
}
arr[j
- 1] = 0;
printf(
"第%4d个出局的人是:%4d号\n", i, j);
}
free(arr);
return j;
}
int main()
{
int n, m;
scanf(
"%d%d", &n, &m);
printf(
"最后胜利的是%d号!\n", Josephu(n, m));
system(
"pause");
return 0;
}
链表实现:
#include
<stdio.h>
#include
<malloc.h>
typedef
struct Node
{
int index;
struct Node *next;
}JosephuNode;
int Josephu(int n, int m)
{
int i, j;
JosephuNode
*head, *tail;
head
= tail = (JosephuNode *)malloc(sizeof(JosephuNode));
for (i = 1; i < n; ++i)
{
tail
->index = i;
tail
->next = (JosephuNode *)malloc(sizeof(JosephuNode));
tail
= tail->next;
}
tail
->index = i;
tail
->next = head;

for (i = 1; tail != head; ++i)
{
for (j = 1; j < m; ++j)
{
tail
= head;
head
= head->next;
}
tail
->next = head->next;
printf(
"第%4d个出局的人是:%4d号\n", i, head->index);
free(head);
head
= tail->next;
}
i
= head->index;
free(head);
return i;
}
int main()
{
int n, m;
scanf(
"%d%d", &n, &m);
printf(
"最后胜利的是%d号!\n", Josephu(n, m));
system(
"pause");
return 0;
}

已知strcpy函数的原型是:

char * strcpy(char * strDest,const char * strSrc);
1.不调用库函数,实现strcpy函数。
2.解释为什么要返回char *。
解说:
1.strcpy的实现代码

char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strSrc==NULL)) file://[/1]
throw "Invalid argument(s)"; //[2]
char * strDestCopy=strDest; file://[/3]
while ((*strDest++=*strSrc++)!='\0'); file://[/4]
return strDestCopy;
}

错误的做法:
[1]
(A)不检查指针的有效性,说明答题者不注重代码的健壮性。
(B)检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false三个关键字以提供更安全的条件表达式。
(C)检查指针的有效性时使用((strDest==0)||(strSrc==0)),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。
[2]
(A)return new string("Invalid argument(s)");,说明答题者根本不知道返回值的用途,并且他对内存泄漏也没有警惕心。从函数中返回函数体内分配的内存是十分危险的做法,他把释放内存的义务抛给不知情的调用者,绝大多数情况下,调用者不会释放内存,这导致内存泄漏。
(B)return 0;,说明答题者没有掌握异常机制。调用者有可能忘记检查返回值,调用者还可能无法检查返回值(见后面的链式表达式)。妄想让返回值肩负返回正确值和异常值的双重功能,其结果往往是两种功能都失效。应该以抛出异常来代替返回值,这样可以减轻调用者的负担、使错误不会被忽略、增强程序的可维护性。
[3]
(A)忘记保存原始的strDest值,说明答题者逻辑思维不严密。
[4]
(A)循环写成while (*strDest++=*strSrc++);,同[1](B)。
(B)循环写成while (*strSrc!='\0') *strDest++=*strSrc++;,说明答题者对边界条件的检查不力。循环体结束后,strDest字符串的末尾没有正确地加上'\0'。

0
0
标签:面试题集

求职面试热门文章

    求职面试最新文章

      最新新闻

        热门新闻