別太把面試題當回事兒

  找工做要面試,因此在這最難就業季,不少人對面試題特別感興趣,津津有味地研究,孜孜不倦地學習。html

  但實際上這些面試題目參差不齊,許多題目根本上就是垃圾和毒藥。git

  好比問「空結構體」的尺寸是多少,實際上C語言中根本就沒有「空結構體」,由於結構體的定義自己就規定結構體不能夠爲空。因此,「空結構體」的尺寸是多少這樣的問題是驢脣不對馬嘴的僞問題。面試

  有些題目喜歡轉牛角尖,好比問調用 算法

  malloc(0)

   獲得的返回值是不是NULL?(http://www.cnblogs.com/wuyuegb2312/p/3219659.html)編程

  這在實踐中是基本沒用的知識。函數

  儘管沒用,但問題自己仍是成立的。好笑的是給出的解答是錯的,解答居然說malloc(0)返回的必定不是NULL。學習

  實際上malloc(0)的返回值多是NULL也可能不是NULL,和實參爲一個正整數時沒什麼區別。若是返回值不爲NULL,也應該用free()函數釋放。malloc(0)惟一不一樣的地方就是,就算你申請內存成功,即malloc(0)返回值不爲NULL,你也無法使用這塊內存。spa

  有一些考察編程能力的題目,則直接暴露出了出題者的編程能力不好。好比code

兩個單鏈表(singly linked list),每個節點裏面一個0-9的數字,輸入就至關於兩個大數了。而後返回這兩個數的和(一個新list)。這兩個輸入的list長度相等。 要求是:1. 不用遞歸。2. 要求算法在最好的狀況下,只遍歷兩個list一次 ,最差的狀況下兩遍。(鏈表存儲數據爲從低位到高位)htm

  這個題目就很搞笑。由於只要小學畢業,就知道多位數加法只須要從低位到高位遍歷一次就能夠了,遍歷兩次說明小學沒畢業。非但只須要一次,一樣不須要兩個加數位數相同。計算和這個過程既然能在紙上用筆完成,那麼用代碼一樣也可以完成。

  那麼,題目爲何給出「兩個輸入的list長度相等」這樣沒用的條件以及「最差的狀況下兩遍」這樣笨拙的要求呢?只能解釋爲出題者本身不會用代碼處理兩個list長度不相等的狀況,而且寫不出遍歷一次的代碼。

  實際這個問題一點也不難,會寫鏈表的人都能輕易寫出兩個list不等長,且兩鏈表只遍歷一次求和的代碼。

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

typedef
   struct bignum
   {
      char dig ;
      struct bignum * next ;  
   }
* LIST  ;

LIST get_num( void );
void my_malloc( LIST * );
void output( LIST );
LIST add( LIST ,LIST );
void my_free( LIST );
void move( LIST * );
int get_dig( LIST );
void put( int , LIST * );

int main( void )
{
  LIST p_num1 , p_num2 ;
  LIST p_sum ;
 
  puts("輸入一個整數:");
  p_num1 = get_num();
  puts("輸入一個整數:");
  p_num2 = get_num();

  p_sum = add( p_num1 ,p_num2 );
 
  output(p_sum);
  putchar('\n');
 
  my_free(p_sum);
  my_free(p_num1);
  my_free(p_num2);
 
  return 0;
}

void my_malloc( LIST * p )
{
   if ( ( * p = malloc( sizeof ( * * p ) )) == NULL )
      exit(1);  
}

//輸入,創建從低位到高位的鏈表
LIST get_num( void )
{
   LIST p = NULL ;
   int c ;
   while ( ( c = getchar() ) && isdigit( c ) )
   {
      LIST tmp ;
      my_malloc ( &tmp );
      tmp -> dig = c - '0';
      tmp ->next = p ;
      p = tmp ;
   }
   return p;
}

void my_free( LIST p )
{
   if ( p->next != NULL )
      free( p->next );

   free( p );  
}

int get_dig( LIST p )
{
   if ( p == NULL )
       return 0;
   return p ->dig ;
}

void move( LIST * pp )
{
   if ( *pp == NULL )
      return ;
   *pp = (*pp) -> next ;  
}

void put( int n , LIST * pp )
{
   my_malloc( pp );
   (*pp)->dig = n ;
   (*pp)->next= NULL;  
}

LIST add( LIST p1 ,LIST p2 )
{
   LIST p_res = NULL ;
   LIST * pp_res = & p_res ;
   char low , high = 0 ;
   while ( p1 != NULL || p2 != NULL )
   {
      low = high ;                            //high爲前一次的進位                    
      low +=  get_dig( p1 ) + get_dig( p2 ) ;
      high = low / 10 ;                       //記下進位
      low %= 10 ;
     
      put( low , pp_res );                   //將和放入新結點
     
      pp_res = & (*pp_res)->next ;
     
      move( &p1 ) , move( &p2 ) ;
   }
  
   if ( high != 0 )                          //處理最高位的進位                
      put( high , pp_res );

   return p_res;
}


void output( LIST p )
{
   if ( p->next != NULL )
      output( p->next );

   putchar( p -> dig + '0' );

}

  寫到這裏,我很想說,有些面試官根本就是南郭先生濫竽充數,有些面試題的解答者也如是。但爲了不由於把「想」的東西說出來遭到刑拘,我仍是說有些面試官不是南郭先生濫竽充數好了。

  至因而否把南郭先生們出的面試題及垃圾解答當回事,您本身看着辦好了。
===========================================

王愛學志 網友指出了拙文代碼中的兩處錯誤,在此表示萬分感謝!
下面是更正後的代碼,歡迎你們批評指正。

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

typedef 
   struct bignum
   {
      char dig ;
      struct bignum * next ;   
   }
* LIST  ;

LIST get_num( void );
void my_malloc( LIST * );
void output( LIST );
LIST add( LIST ,LIST );
void my_free( LIST );
void move( LIST * );
int get_dig( LIST );
void put( int , LIST * );

int main( void )
{
  LIST p_num1 , p_num2 ;
  LIST p_sum ;
  
  puts("輸入一個整數:");
  p_num1 = get_num();
  puts("輸入一個整數:");
  p_num2 = get_num();
  p_sum = add( p_num1 ,p_num2 );
  
  output(p_sum);
  putchar('\n');
  
  my_free(p_sum);
  my_free(p_num1);
  my_free(p_num2);
  system("PAUSE");
  return 0;
}
void my_malloc( LIST * p )
{
   if ( ( * p = malloc( sizeof ( * * p ) )) == NULL )
      exit(1);   
}
//輸入,創建從低位到高位的鏈表 
LIST get_num( void )
{
   LIST p = NULL ;
   int c ;
   while ( ( c = getchar() ) && isdigit( c ) )
   {
      LIST tmp ;
      my_malloc ( &tmp );
      tmp -> dig = c - '0';
      tmp ->next = p ;
      p = tmp ;
   }
   return p;
}
void my_free( LIST p )

{
   if ( p == NULL )
      return ;

   my_free( p->next );
   free(p);
}

int get_dig( LIST p )
{
   if ( p == NULL )
       return 0;
   return p ->dig ;
}

void move( LIST * pp )
{
   if ( *pp == NULL )
      return ;
   *pp = (*pp) -> next ;   
}

void put( int n , LIST * pp )
{
   my_malloc( pp );
   (*pp)->dig = n ;
   (*pp)->next= NULL;   
}

LIST add( LIST p1 ,LIST p2 )
{
   LIST p_res = NULL ;
   LIST * pp_res = & p_res ;
   char low , high = 0 ;
   while ( p1 != NULL || p2 != NULL )
   {
      low = high ;                            //high爲前一次的進位                     
      low +=  get_dig( p1 ) + get_dig( p2 ) ;
      high = low / 10 ;                       //記下進位 
      low %= 10 ;
      
      put( low , pp_res );                   //將和放入新結點 
      
      pp_res = & (*pp_res)->next ; 
      
      move( &p1 ) , move( &p2 ) ;
   }
   
   if ( high != 0 )                          //處理最高位的進位                 
      put( high , pp_res );
   return p_res;
}

void output( LIST p )
{
   if ( p == NULL )
      return ;
   output( p->next );
   putchar( p -> dig + '0' );
}
相關文章
相關標籤/搜索