고전 면접 문제 (3) 부 답 알고리즘 + 데이터 구조 + 코드 마이크로소프트, 구 글 구 글, 바 이 두, 텐 센트

13907 단어
<pre name="code" class="cpp">1.         ,       (2011 MTK)
            ?
        ?
 
      。
1.      。      。      1,       2,            。  ,    ,         。
2.    。         ,            ,       。  ,   1                。
3.     。         ,            ,              。  ,        ,     1。                   。
 
         ,      。

  ,           a ,       b ,          x     。
S( i )         i  ,       。
  ,      S( a ),      a         。
     :
        x   a         S( a ),  S( x + a ) = S( a )
        ,   a = tb   ( t = 1, 2, …. ), S( x + a ) = S( a )
    a = tb?
       ,           ,  S( x ) = S( 2x )
        ,   2x = x + bt,  x = tb. 
[cpp] view plaincopy 
struct Node  
{  
    int data;  
    Node* next;  
  
    Node( int value ): data(value), next(NULL) {};  
};  
  
//           
bool IsCircle( Node *pHead )  
{  
    //             next   ,     
    if( pHead == NULL || pHead->next == NULL ) return false;  
      
    Node *pSlow = pHead;  
    Node *pFast = pHead;  
  
    while( ( pFast != NULL ) && ( pFast->next != NULL )  )  
    {  
        //     1、2    
        pSlow = pSlow->next;  
        pFast = pFast->next->next;  
  
        if( pSlow == pFast ) break;  
    }  
    if( ( pFast == NULL ) || ( pFast->next == NULL ) )   
        return false;  
    else   
        return true;  
}  
  
//       
int GetLen( Node *pHead )  
{  
    if( pHead == NULL || pHead->next == NULL ) return false;  
      
    Node *pSlow = pHead;  
    Node *pFast = pHead;  
  
    //      
    while( ( pFast != NULL ) && ( pFast->next != NULL )  )  
    {  
        pSlow = pSlow->next;  
        pFast = pFast->next->next;  
  
        if( pSlow == pFast ) break;  
    }  
  
    //      
    int cnt = 0;  
    while( ( pFast != NULL ) && ( pFast->next != NULL )  )  
    {  
        pSlow = pSlow->next;  
        pFast = pFast->next->next;  
        cnt++;  
  
        //     ,             
        if( pSlow == pFast ) break;  
    }  
    return cnt;  
}  
//        
Node* GetEntrance( Node* pHead )  
{  
    if( pHead == NULL || pHead->next == NULL ) return false;  
      
    Node *pSlow = pHead;  
    Node *pFast = pHead;  
  
    //      
    while( ( pFast != NULL ) && ( pFast->next != NULL )  )  
    {  
        pSlow = pSlow->next;  
        pFast = pFast->next->next;  
  
        if( pSlow == pFast ) break;  
    }  
  
    pSlow = pHead;  
    while( pSlow != pFast )  
    {  
        //      
        pSlow = pSlow->next;  
        pFast = pFast->next;  
    }  
    return pSlow;  
}  
 2.               (2011 MTK)
              
 
       ,      。
   :                      。
  :??
[cpp] view plaincopy 
//           
Node* merge( Node* pHeadA, Node* pHeadB )  
{  
    //       
    if( pHeadA == NULL || pHeadB == NULL )  
    {  
        return ( pHeadA == NULL ) ? pHeadB : pHeadA;  
    }  
  
    //         
    Node *px, *py;  
    if( pHeadA->data <= pHeadB->data )  
    {  
        px = pHeadA;    py = pHeadB;  
    }  
    else  
    {  
        px = pHeadB;    py = pHeadA;  
    }  
    Node *pResult = px;  
  
    // py          px  
    Node *pre = px;  
    px = px->next;  
    while( py != NULL && px != NULL )  
    {  
        // px   py         
        while( py != NULL && px != NULL && py->data > px->data )  
        {  
            py = py->next;  
            px = px->next;  
            pre = pre->next;   
        }  
        //py   pre px    
        if( py != NULL && px != NULL )  
        {  
            //py      
            Node* tmp = py;  
            py = py->next;  
  
            //pre      
            Node* tmpPre = pre;  
            pre = pre->next;  
  
            //    
            tmp->next = px;  
            tmpPre->next = tmp;  
  
            //px      
            px = px->next;             
        }  
        else  
            break;  
    }  
    if( px == NULL ) pre->next = py;  
  
    return pResult;  
}  
4    :     (long )               ,    printf   
              。                    ,                     。  ,      :          。         ,       。               ,        。 
[cpp] view plaincopy 
void LongFormat( long value )  
{     
    //       
    long mask = 0x1 << ( 8 * sizeof(long) - 1 );  
    if( value & mask ) cout << "1";  
    else cout << "0";  
    //        
    mask = 0x1 << ( 8 * sizeof(long) - 2 );  
    for( int i=1; i<8*sizeof(long); i++ )  
    {  
        if( value & mask ) cout << "1";  
        else cout << "0";  
        mask >>= 1;  
    }  
    cout << endl;  
  
    //       
    cout << "0x";   
    mask = 0xF << ( 8 * sizeof(long) - 4 );  
    long tmp = ( value & mask ) >> ( 8 * sizeof(long) - 4 );  
    if( tmp < 10 )  
        cout << tmp;  
    else  
        cout << (char)( 'a' + ( tmp - 10 ) );  
    //         
    mask = 0xF << ( 8 * sizeof(long) - 8 );  
    for( int i=1; i<2*sizeof(long); i++ )  
    {  
        tmp = ( value & mask ) >> ( 8 * sizeof(long) - 4 * i - 4 );  
        if( tmp < 10 )  
            cout << tmp;  
        else  
            cout << (char)( 'a' + ( tmp - 10 ) );  
  
        mask >>= 4;   
    }  
}  
5.    :                , "abccade","dgcadde"      "cad" 
   :  KMP。  KMP  ,      。
    :      ,    、    ,      。      1,      0。          1  ,             。     0( m*n ),         O( m*n )

        ,        O( m*n )。 ,     A      ,    B           。 ,          ,       , 。 
[cpp] view plaincopy 
void GetSubStr( char *strA, char *strB, char *ans )  
{     
    int max = 0;  
    char *pAns = NULL;  
  
    //     A  
    for( int i=0; *(strA+i) != '\0'; i++ )  
    {  
        //  strB    ,    strB            
        char *pb = strB;  
        while( *pb != '\0' )  
        {  
            //  strA      
            char *pa = strA + i;  
            int cnt = 0;  
            char *pBegin = pb;  
  
            //             
            if( *pb == *pa )  
            {  
                while( *pb == *pa && *pb != '\0' )   
                {  
                    pa++;  
                    pb++;  
                    cnt++;  
                }  
                if( cnt > max )  
                {  
                    max = cnt;  
                    pAns = pBegin;  
                }     
                if( *pb == '\0' ) break;  
            }  
            else  
                pb++;             
        }         
    }  
    //      
    memcpy( ans, pAns, max );     
    *(ans+max) = '\0';  
}  
6.            :
struct node
{
  int data;
  struct node *front,*next;
};
         A,B,       :pHeadA,pHeadB,          data        。
 
          NB  。       A, A     ,       B   。   B   ,           ,    A       。
     ,        。  ,                     。                 ?p->next == pHead.
    :
             
              
[cpp] view plaincopy 
struct Node  
{   
  int data;  
  struct Node *front,*next;  
  Node( int value ): data( value ), front( NULL ), next( NULL ) { };  
  void SetPointer( Node *pPre, Node *pNext ) { front = pPre; next = pNext; };  
};  
  
//         。  ,   。  
bool DeleteValue( Node *&pHead, int target )  
{  
    if( pHead == NULL ) return false;     
  
    //         
    bool flag = false;  
    Node* ph = pHead;  
    while( ph->next != pHead  )  
    {  
        Node *pPre = ph->front;  
        Node *pNext = ph->next;  
  
        if( ph->data == target )  
        {  
            //             
            if( ph == pHead ) pHead = ph->next;            
  
            pPre->next = pNext;  
            pNext->front = pPre;   
  
            Node *tmp = ph;  
            delete tmp;  
              
            //        
            flag = true;  
        }  
        ph = pNext;  
    }  
    //               
    if( ph->next == pHead )  
    {  
        if( ph->data == target )  
        {  
            //               
            if( ph->front != ph )  
            {                 
                Node *pPre = ph->front;  
                Node *pNext = ph->next;  
                pPre->next = pNext;  
                pNext->front = pPre;   
  
                Node *tmp = ph;  
                delete tmp;  
            }  
            else  
            {  
                delete pHead;  
                pHead = NULL;             
            }  
            flag = true;              
        }         
    }  
    return flag;  
}  
  
  
void DeleteSame( Node *&pHeadA, Node *&pHeadB )  
{  
    if( pHeadA != NULL && pHeadB != NULL )  
    {  
        Node *pa = pHeadA;  
        while( pa->next != pHeadA )  
        {             
            //  B   pa->data,                  
            if( DeleteValue( pHeadB, pa->data ) )  
            {  
                // A   pa->data  
                Node *tmp = pa->next;  
                DeleteValue( pHeadA, pa->data );  
                pa = tmp;  
            }  
            else  
                pa = pa->next;  
        }  
        //                            
        if( DeleteValue( pHeadB, pa->data ) )  
        {  
            DeleteValue( pHeadA, pa->data );  
        }         
    }  
}  
7.    int atoi(char *s)。
int i=(j=4,k=8,l=16,m=32); printf(“%d”, i);      ?
      、            。
        。
              。
 
1.      ,  ,      。
2.                       。    , i=(m=32)
3.    :         。     :          。
    :          。     :                 。
    :static  ,        。            ,         。  ,                。              :               ,               。
4. :  new         ,             ,            ,      。
 :      、         ,             。 
8.       
  :      ,                       。
  :        :
1              2              3              4
5              6              7              8
9              10             11             12
13             14             15             16
        , 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。
  :  Autodesk、EMC                     
 
               ,             。              ,          2,               。      ,      0、1   。 ,    。          。    ,    ,      。
[cpp] view plaincopy 
const int MAX_ROW = 100;  
const int MAX_COL = 100;  
  
void PrintMatrix( int data[][MAX_COL], int row, int col )  
{  
    int top = 0;  
    int bottom = row-1;  
    int left = 0;  
    int right = col-1;  
  
    int cnt = 0;  
    int total = row * col;  
    while( cnt < total )  
    {  
        //    ,         
        int j;  
        for( j=left; j<=right && cnt<total; j++ )  
        {  
            cout << data[top][j] <<" ";  
            cnt++;  
        }  
        top++;  
  
        //    ,         
        for( j=top; j<=bottom && cnt<total; j++ )  
        {  
            cout << data[j][right] << " ";  
            cnt++;  
        }  
        right--;  
  
        //    ,         
        for( j=right; j>=left && cnt<total; j-- )  
        {  
            cout << data[bottom][j] << " ";  
            cnt++;  
        }  
        bottom--;  
  
        //    ,         
        for( j=bottom; j>=top && cnt<total; j-- )  
        {  
            cout << data[j][left] << " ";  
            cnt++;  
        }  
        left++;  
    }             
}  
9.           
  :       ,                   。
       “google”,                 “goog”,    。
  :                       ,                
 
10. 1、2、3、4、5、6     ,   main  ,          , :512234、412345 ,  :"4"      ,"3" "5"    .
 
               ,               (  ,      ,       )。  ,        ,       ,               ,    。
[cpp] view plaincopy 
bool IsValid( char *str )  
{  
    for( int i=1; *(str+i) != '\0'; i++ )  
    {  
        if( i == 2 && *(str+i) == '4' ) return false;  
  
        if( *(str+i) == '3' && *(str+i-1) == '5' || *(str+i) == '5' && *(str+i-1) == '3' )  
            return false;  
    }  
    return true;  
}  
  
void PrintStr( char *str, char *start )  
{  
    if( str == NULL ) return;  
      
    if( *start == '\0' )  
    {  
        if( IsValid( str ) ) cout << str << endl;  
    }  
  
    for( char *ptmp = start; *ptmp != '\0'; ptmp++ )  
    {  
        char tmp = *start;  
        *start = *ptmp;  
        *ptmp = tmp;  
  
        PrintStr( str, start+1 );  
  
        tmp = *start;  
        *start = *ptmp;  
        *ptmp = tmp;   
    }  
}  
11。     
      ,            2  3  5   ,1           。  1500     ?
 
       2、3、5       30。[ 1, 30]        22 。     [ 31, 60]   22       ,         。    ,        ,    30.
        1500   :1500/22=68   1500%68=4。    : 1500        68   ,            4  。       4  :2,3,4,5。
 ,   68*30=2040+5=2045
 
12.        
  :          ,               。        :
struct ListNode
{
  int  m_nKey;
  ListNode* m_pNext;
};
  :            。                    、    。
 
       。       :     ,  3     ,          。            ,     。             ,       ,         。
[cpp] view plaincopy 
struct ListNode  
{  
    int  m_nKey;  
    ListNode* m_pNext;  
};  
  
void PrintReverse( ListNode* pHead )  
{  
    ListNode* ph = pHead;  
    if( ph != NULL )  
    {  
        PrintReverse( ph->m_pNext );  
        cout << ph->m_nKey << " ";  
    }  

좋은 웹페이지 즐겨찾기