現在的公司招聘,都要筆試面試.如果你不是那種編程功底非常深厚的人,又不好好準備一番,在筆試面試中往往會處於被動局面.雖然有些筆試題是故意爲難我們,有點鑽牛角尖.但是很多筆試題面試題確實能夠很好地看出我們的基礎.
在這裏,我就略去那些鑽牛角尖的題.從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[N]是否爲一個遞增數組。
答:遞歸算法:
#include <stdio.h>
#include <conio.h>
#define N 5
int Judgment(int a[]);
int main()
{
int a[N], 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[N], 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;
}