别太把面试题当回事儿

  找工做要面试,因此在这最难就业季,不少人对面试题特别感兴趣,津津有味地研究,孜孜不倦地学习。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' );
}
相关文章
相关标签/搜索