C/C++校招筆試面試經典題目總結六

題目51:寫一個函數找出一個整數數組中,第二大的數(microsoft)

解析:
const int MINNUMBER = -32767 ;
int find_sec_max( int data[] , int count)
{
int maxnumber = data[0] ;
int sec_max = MINNUMBER ;
for ( int i = 1 ; i < count ; i++)
{
if ( data[i] > maxnumber )
{
sec_max = maxnumber ;
maxnumber = data[i] ;
}
else
{
if ( data[i] > sec_max )
sec_max = data[i] ;
}
}
return sec_max ;
}

題目52:輸入一個字符串,將其逆序後輸出

解析:
第一種:
#include <iostream>
using namespace std;

void main()
{
  char a[50];memset(a,0,sizeof(a));
  int i=0,j;
  char t;
  cin.getline(a,50,'\n');
  for(i=0,j=strlen(a)-1;i<strlen(a)/2;i++,j--)
  {
   t=a[i];
      a[i]=a[j];
   a[j]=t;
  }
  cout<<a<<endl;  
}
第二種:
string str;
cin>>str;
str.replace;
cout<<str;

題目53:下列表達式正確的是:


A:9++
B:(x+y)++
C:c+++c+++c++
D:++(a-b--)
解析:C9是一個常量,常量不能自增自減,而( x+y )和下面的( a -b )都是作爲一種只讀內存區存在的,所以都不能進行自增自減操作。

題目54:編程實現:找出兩個字符串中最大公共子字符串,"abccade","dgcadde"的最大子串爲"cad" 

解析:
int GetCommon(char *s1, char *s2, char **r1, char **r2) 
{ 
int len1 = strlen(s1); 
int len2 = strlen(s2); 
int maxlen = 0; 

for(int i = 0; i < len1; i++) 
{ 
for(int j = 0; j < len2; j++) 
{ 
if(s1[i] == s2[j]) 
{ 
int as = i, bs = j, count = 1; 
while(as + 1 < len1 && bs + 1 < len2 && s1[++as] == s2[++bs]) 
count++; 

if(count > maxlen) 
{ 
maxlen = count; 
*r1 = s1 + i; 
*r2 = s2 + j; 
} 
} 
} 
}

題目55:test.c文件中包括如下語句,文件中定義的四個變量,哪個變量不是指針類型?

#define INT_PTR int*
typedef int*int_ptr;
INT_PTR a,b;
int_ptr c,d;
A:a     B:b   C:c    D:d  E:都是指針   F:都不是指針
解析:B  注意define與typedef的區別。前者只是簡單的替換,替換後是int* a,b,b是int類型;typedef不是簡單替換 ,而是採用如同定義變量的方法那樣來聲明一種類型,c,d都是指針類型。

題目56:針對以下代碼,判斷下列說法哪個是正確的()

const char str1[] = "abc";
const char str2[] = "abc";
const char *p1 = "abc";
const char *p2 = "abc";
A:str1和str2地址不同,P1和P2地址相同
B:str1和str2地址相同,P1和P2地址相同
C:str1和str2地址不同,P1和P2地址不同
D:str1和str2地址相同,P1和P2地址不同
E:4個地址都相同
F:4個地址都不同
解析:選A
str1和str2是棧空間中的兩個字符數組,地址不同
p1和p2指向的位置在常量區,值都是“abc”所以是同一常量,地址相同

題目57:下列 C 代碼中,不屬於未定義行爲的有___

A:Int i=0;i=(i++);
B:char *p=”hello”;p[1]=’E’;
C:char *p=”hello”;char ch=*p++;
D:int i=0;printf(“%d%d\n”,i++,i--);
E:都是未定義行爲
F:都不是未定義行爲

解析:C  A,D:表達式的先後順序,是由編譯器決定的,有可能不同
 B:常量字符串不能修改,指針改爲數組可以。

題目58:程序出錯在什麼階段__?

int main(void) {
    http://www.taobao.com
    cout << "welcome to taobao" << endl; 
}
A:預處理階段出錯
B:編譯階段出錯
C:彙編階段出錯
D:鏈接階段出錯
E:運行階段出錯
F:程序運行正常

解析:F雙斜槓之後的www.csdn.net被當做註釋了,那麼前面的http:是否合法?這就是C++中一個幾乎不會被用到的語法,標籤。帶標籤的語句是一種特殊的語句,在語句前面有一個標識符(即標籤,上段代碼中的http)和一個冒號。使用goto label就可以跳到標籤處執行,比如可以在代碼中寫goto http,這樣就會執行cout語句了。

題目59:給出以下定義,下列哪些操作是合法的?

char a[] = "hello";
char b[] = "world";
const char *p1 = a;
char* const p2 = b;
A:p1++
B:p1[2]='w';
C:p2[2]='l';
D:p2++
解析:A,C。p1是指向常量的指針,所指向的內容不能變,所以改變p1指向的值是不對的。
    p2是一個指針常量,它本身的指向不能改變,所以對p2的下標操作是不對的。

題目60: 字符串比較的KMP算法

KMP具體的思想就是利用有限自動機來快速匹配,利用O(m)的空間來存儲pattern內pattern從左開始的所有連續子串的自我覆蓋程度。存儲的-1表示沒有任何覆蓋,存儲的0,表示有一個匹配。然後利用建立好的這個覆蓋程序數組,在KMP算法中進行字符串匹配失敗的時候,可以根據這個值來覺得待比較的位置前進的個數,而不是跟樸素的算法一樣是一個一個前進的。
代碼實現:
void   Next(char str[], int len)
{
     next[0]=-1;
     for(int i=1;i<len;i++)
     {
         if(next[i-1]==-1&&str[i]==str[0])
             next[i]=0;
         else if(next[i-1]>=0&&str[next[i-1]+1]==str[i])
             next[i]=next[i-1]+1;
         else
             next[i]=-1;
     }
}
int KMP(char source[],int lenS,char pattern[],int lenP)
{
    int source_index=0;
    int pattern_index=0;
    Next(pattern,lenP);
    while(source_index<lenS && pattern_index<lenP)
    {
          if(source[source_index]==pattern[pattern_index])
          {
                ++source_index;
                ++pattern_index;                                                 
          }
          else
          {
              if(pattern_index==0)
                  source_index++;
              else
                  pattern_index = next[pattern_index-1]+1;
          }                          
    }
    if(pattern_index == lenP)
        return source_index-lenP;
    else
        return -1;
}
明天努力更新!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章