面試題解析
原文地址:面試題解答作者:飛雪
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
2.
(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中的數字
(2)
char **p, a[16][8];
問:p=a是否會導致程式在以後出現問題?為什麼?
3.用遞迴方式,非遞迴方式寫函式將一個字串反轉.
函式原型如下:char *reverse(char *str);
答案如下:
//非遞迴方法
char *reverse(char *str)
{
int nLen = strlen( str ) ;
for ( int i=0; i
{
char temp ;
temp = str[i] ;
str[i] = str[nLen-i-1] ;
str[nLen-i-1] = temp ;
}
return str ;
}
//遞迴方法1
char *reverse2(char *str)
{
//這種方法就直觀,但是當字串很長的時候就很低效
if( *(str+1)==\ )
{
return NULL ;
}
for( char* o=str+strlen(str)-1, char t=*o; o!=str; o-- )
{
*o=*(o-1);
}
*str=t;
reverse2(str+1);
return str ;
}
//遞迴方法2
char *reverse3(char* str)
{
//這是這種方法的關鍵,使用static為的.是能用str_reverse的思路,但是不好
static char* x=0;
if( x==0 )
{
x=str;
}
char* q = x+strlen(str)-1;
if( str==q )
{
return NULL;
}
(*q)^=(*str)^=(*q)^=(*str);
if( q == str+1 )
{
return NULL;
}
reverse(++str);
return str ;
}
4.strcpy函式和memcpy函式有什麼區別?它們各自使用時應該注意什麼問題?
答:strcpy函式屬於字元複製函式,當它遇到\時,複製結束.
memcpy函式屬於記憶體複製函式,它會複製指定長度的字元到目的變數。
5.寫一個函式將一個連結串列逆序.
struct link
{
int data ;
link *next ;
};
//非遞迴方法
link *ReverseLink( link *head )
{
link *pre = head ;
link *cur = head->next ;
link *next = NULL ;
if( cur )
{
next = cur->next ;
cur->next = pre ;
pre = cur ;
cur = next ;
}
pre->next = NULL ;
head = pre ;
}
//遞迴方法
link *ReverseLink( link *p, link *& head )
{
if( p==NULL || p->next==NULL )
{
head = p ;
return p ;
}
else
{
link *temp = NULL ;
temp = ReverseLink( p->next, head ) ;
temp->next = p ;
return p ;
}
}
一個單鏈表,不知道長度,寫一個函式快速找到中間節點的位置.
struct link
{
int data ;
link *next ;
};
link *FindMid( link *head )
{
link *p1 = head ;
link *p2 = head->next ;
do
{
p1 = p1->next ;
p2 = p2->next ;
}while( p2 && p2->next ) ;
return p1 ;
}
寫一個函式找出一個單向連結串列的倒數第n個節點的指標.(把能想到的最好演算法寫出).
6.用遞迴演算法判斷陣列a[N]是否為一個遞增陣列。
7.
有一個檔案(名為a.txt)如下,每行有4項,第一項是他們的名次,寫一個c程式,將五個人的名字打印出來.並按名次排序後將5行資料仍然儲存到a.txt中.使檔案按名次排列每行.
2,07010188,0711,李鎮豪,
1,07010154,0421,陳亦良,
3,07010194,0312,凌瑞松,
4,07010209,0351,羅安祥,
5,07010237,0961,黃世傳,
8.寫一個函式,判斷一個unsigned char 字元有幾位是1.
int FindNum( char *str )
{
int num = 0 ;
while( *str != )
{
if( *str == 1 )
{
num ++ ;
str ++ ;
}
else
{
str ++ ;
}
}
return num ;
}
寫一個函式判斷計算機的位元組儲存順序是升序(little-endian)還是降序(big-endian).
9.微軟的筆試題.
Implement a string class in C++ with basic functionality like comparison, concatenation, input and output. please also provide some test cases and using scenarios (sample code of using this class).
please do not use MFC, STL and other libraries in your implementation.
10.有個陣列a[100]存放了100個數,這100個數取自1-99,且只有兩個相同的數,剩下的98個數不同,寫一個搜尋演算法找出相同的那個數的值.(注意空間效率時間效率儘可能要低).