您的位置:首页 > 职场人生

中兴软件面试题2

2014-08-19 21:02 127 查看
现在的公司招聘,都要笔试面试.如果你不是那种编程功底非常深厚的人,又不好好准备一番,在笔试面试中往往会处于被动局面.虽然有些笔试题是故意为难我们,有点钻牛角尖.但是很多笔试题面试题确实能够很好地看出我们的基础.
在这里,我就略去那些钻牛角尖的题.从csdn论坛我近半年的收集中选出10道有代表性的题目,难度基本上是逐渐加大.对数组,指针,数据结构,算法,字符串,文件操作等问题都有覆盖.主要以c语言的实现为主,也有c++的题.大家可以先做做这10道题,测试一下自己的水平.
1. 下面这段代码的输出是多少(在32位机上).
char *p;
char *q[20];
char *m[20][20];
int (*n)[10];
struct MyStruct
{
char dda;
double dda1;
int type ;
};
MyStruct k;
printf("%d %d %d %d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));
答案:4,80,1600,4,24
(1)
char a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}} };
for(int i=0;i<12;i++)
printf("%d ",__a[0][0][i]_);
在空格处填上合适的语句,顺序打印出a中的数字
(2)
char **p, a[16][8];
问:p=a是否会导致程序在以后出现问题?为什么?
答:没有问题,只是使用时要小心,p是指向指针的指针。
3.用递归方式,非递归方式写函数将一个字符串反转.
函数原型如下:char *reverse(char *str);
答:非递归方式:
char *reverse(char *str)
{
if(str!=NULL)
{
int length = strlen(str);
for(int i=0;i<length/2;++i)
{
char temp=str[i];
str[i]= str[length-1];
str[length-1] =temp;
}
}
printf("%s/n",str);
}
递归方式:搞不定
char *reverse(char *str)
{
if(str==NULL||strlen(str)==1)
return str;
int i;
if(i==1)
str[i] = '/0';
return str[i];
。。。。
}
4.strcpy函数和memcpy函数有什么区别?它们各自使用时应该注意什么问题?
答:strcpy函数:拷贝字符串
memcpy函数:拷贝任何数据
5.写一个函数将一个链表逆序.
答:简单
6一个单链表,不知道长度,写一个函数快速找到中间节点的位置.
答:typedef struct linknode
{
int a;
struct linknode *next;
}linknode;
linknode *findmiddle(linknode *head)
{
linknode *fast,*low,*p;
if(head==NULL)
{
return NULL;
}
fast=low=head;
while(!(p=fast->next)&&!p->next)
{
low=low->next;
fast=p->next;
}
return low;
}
7 写一个函数找出一个单向链表的倒数第n个节点的指针.(把能想到的最好算法写出).
答:两个指针,第一个先于第二个n个位置。
LinkNode IsLoopList(LinkNode *head,int n)
{
LinkNode *p1,*p2,*p3;
P1 = head;
While(n-->=0)
{
P3= p2->next;
P2 = p3;
}
While(p3->next!=NULL)
{
P3 = p3->next;
P1 = p1->next;
}
Return p1; //当p3到达结尾时,后于p3n个位置的就是倒数第n个节点。
}

8补充一题:
给你一个单向链表的头指针,可能最后不是NULL终止,而是循环链表。题目问你怎么找出这个链表循环部分的第一个节点。比如下面的链表:

0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> (3) 循环,就应该返回结点3的位置。

当然尽量用少的空间和时间是题目的要求。
答:

10.判断链表是否循环;
答:bool IsLoopList(LinkNode *head)
{

LinkNode *p1= head,*p2= head;

if(head ->next==NULL)//只包含头节点,且头节点的next为NULL说明肯定不是循环链表

return false;

do{

p1=p1->next; //步长为1

p2=p2->next->next; //步长为2

}while(p2 && p2->next && p1!=p2);

if(p1==p2)

return true;

else

return false;

}

11.用递归算法判断数组a
是否为一个递增数组。
答:递归算法:
#include <stdio.h>

#include <conio.h>

#define N 5
int Judgment(int a[]);
int main()

{

int a
, i, flag = 1;

printf("Enter array data: ");

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

{

scanf("%d", &a[i]); //输入数组元素。

}

flag = Judgment(a); //调用递归函数

if (flag == 1)

{

printf("increment array./n");

}

else if (flag == 0)

{

printf("no increment array./n");

}

getch();

return 0;

}
int Judgment(int a[])

{

static i = 0; //注意这个是静态变量,必须用static

if(i < N - 1)

{

if (a[i] > a[i + 1])

{

return 0;
}

i++;

Judgment(a);

}

return 1;

}
非递归算法:
#include <stdio.h>

#include <conio.h>

#define N 5
int Judgment(int a[], int num);
int main()

{

int a
, i, flag = 1;

printf("Enter array data: ");

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

{

scanf("%d", &a[i]);

}

flag = Judgment(a, N);

if (flag == 1)

{

printf("increment array./n");

}

else if (flag == 0)

{

printf("no increment array./n");

}

getch();

return 0;

}

int Judgment(int a[], int num)

{

static i = 0, flag = 1;

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

{

if (a[i] >= a[i+1]) //假如发现哪两个不是递增,立刻跳出;

{

flag = 0;

break;

}

}

return flag;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: