zoukankan      html  css  js  c++  java
  • 别太把面试题当回事儿

      找工作要面试,所以在这最难就业季,很多人对面试题特别感兴趣,津津有味地研究,孜孜不倦地学习。

      但实际上这些面试题目良莠不齐,许多题目根本上就是垃圾和毒药。

      比如问“空结构体”的尺寸是多少,实际上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,你也没法使用这块内存。

      有一些考察编程能力的题目,则直接暴露出了出题者的编程能力很差。比如

    两个单链表(singly linked list),每一个节点里面一个0-9的数字,输入就相当于两个大数了。然后返回这两个数的和(一个新list)。这两个输入的list长度相等。 要求是:1. 不用递归。2. 要求算法在最好的情况下,只遍历两个list一次 ,最差的情况下两遍。(链表存储数据为从低位到高位)

      这个题目就很搞笑。因为只要小学毕业,就知道多位数加法只需要从低位到高位遍历一次就可以了,遍历两次说明小学没毕业。非但只需要一次,同样不需要两个加数位数相同。计算和这个过程既然能在纸上用笔完成,那么用代码同样也能够完成。

      那么,题目为什么给出“两个输入的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(' ');
     
      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('
    ');
      
      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' );
    }
  • 相关阅读:
    连载日记
    自我介绍
    test0710 二分专题
    test0709 搜索专题
    test0705
    test0704
    [题解] [HNOI2015]落忆枫音
    test0606
    test0523
    备份
  • 原文地址:https://www.cnblogs.com/pmer/p/3222648.html
Copyright © 2011-2022 走看看