第一次面试经历

来源:互联网 发布:qq飞车皮皮虾辅助源码 编辑:程序博客网 时间:2024/05/17 09:00

首先介绍了一下公司,然后让我自己介绍了一下。我介绍的比较简单。就说最大的优点在于做事比较认真,
如果我想做一个事情,我会在我能力范围内把它做得最好。然后就没说什么了。随即转入正题。

1、问:你遇到最大的难题是什么?
回答:大学好像没有。高中倒有一次。
问:可以讲一讲么?
回答:就是和一群混混搞在一起,一起到处玩,不务正业。以前高一考过全校第一,后来成绩一直掉,一直掉,掉到快一百名了。高二几乎玩了一年,几乎没有学习。这是我到目前为止遇到最堕落的问题。后来到高三就学习比较认真了。
问:后来你怎么醒悟的呢?
回答:这个。我觉得是个经验的问题吧,经历多了,就感觉看穿了其间的很多问题。比如相互利用啊,之类。感觉自己被耍了。于是就没和他们在一起了。这时候便感觉自己在学习上已经落后太多了。

后面的记得不是很清楚了。。。。感觉这个问题挺奇怪的,我回答的也奇怪。。。


2、你用AdaBoost做过柑橘识别,对吧,描述一下AdaBoost算法?
   AdaBoost算法的思想是将很多弱分类器联合起来,组合成一个强分类器。弱分类器是很容易获得的,而强分类器是很难获得的。因此这个算法能够利用简单的弱分类器构成一个强分类器。随后描述了一下adaboost算法的过程,
然后说了一下杨世泉的那个例子,就是记单词,一天只能记一部分,然后第二天开始,每天都重点记前一天没有记住的单词。这个问题胡吹了一二十分钟的样子。
    问:为什么用AdaBoost呢?
    回答:当时是师姐想试试这个算法的效果。于是我实现了一下,然后做了些实验,发现效果确实不错。
    问:对比其他的比如BP神经网络有什么优势呢?
    回答:BP神经网络很严重的问题是不稳定,然后训练出来的结果也没有AdaBoost好。还试过决策树,其效果也不如AdaBoost。
    问:用过那个矩形特征没?
    回答:尝试过Harr-Like特征。但效果不佳。
   这个系列的问题回答的感觉还可以。因为做的比较多,比较熟悉。

3、写一个 计算字符串长度的函数
long strlen(char *pc)
{
   if( !pc )
     return 0;
  
   long len = 0;
   char *tmp = pc;
   while( *tmp != '/0' )
   {
      len++;
      tmp++;
   }
   tmp = NULL;
   return len;
}

a、为什么要将tmp 设置为 NULL呢?回答:习惯将临时指针用完后设置为NULL
   用临时指针的目的就是为了不改变指针pc的值......沉默十秒后,我将函数定义修改为:
   long strlen( const char *pc )
b、tmp = NULL;是否会存在问题呢?
   回答:这个应该不会存在问题。
   char *tmp = pc;这句有可能存在问题,将一个const指针赋予给非const指针...具体的我也不确定....
c、如果说调用时候我用 char *p = "";那么执行的结果是多少呢?。。。回答:0
   那如果 p=NULL ,执行的结果呢?。。回答:还是0
   继续:这个存在问题。。应该将
   if( !pc )
      return 0;
   修改为
   if( !pc )
      return -1;
   那么 调用这个函数 需要注意什么呢?。。
   回答:需要判断返回值是否大于等于0
d、又问了 const 指针赋值的问题,不太懂,于是重新写了一个计数的过程:
 long strlen(const char *pc)
{
   if( !pc )
     return -1;
  
   long len = 0;
   while( *(pc+len) != '/0' )
   {
      len++;
   }
   return len;
}
   
汗啦。。。一个很小的程序出现这么多多问题,心里开始扑通扑通了。
e、不用循环,也就是不要用for,while,do while,loop之类的语句,重新实现这个功能。
刚开始被这个奇怪的问题吓得有点懵了。
从没有试过不用循环做这种事情。
那改咋办呢?
好像灵魂附体样,突然想到了递归。
于是搞定了:
long strlen(const char *pc)
{
   if( !pc )
     return -1;
  
   if( *pc == '/0' )
     return 0;
   else
     return 1+strlen(pc+1);
}
其实后来想想,用goto语句也是可以的。

这个问题总体回答的一般,主要是很多细节没有注意到。

4、写一个先序遍历,递归与非递归的算法
  我靠,这个超无语。我写成中序遍历了。
  首先设计数据结构:
typedef struct TreeNode
{
    long nodeId;
    TreeNode *left;
    Value node;
    TreeNode *right;
}TreeNode;

  void preL( const TreeNode *root )
  {
    if( !root )
        return;
   
    if( root->left )
         preL( root->left );

    visitNode( root );
 
    if( root->right )
         preL( root->right );
 }

非递归的写了很久,大概半个小时的样子,而且写的非常不完善。
首先想了一下,重点在一个回溯过程,
于是想写一个根据节点获取其父节点的函数,后来感觉很麻烦,于是直接修改数据结构
typedef struct TreeNode
{
    long nodeId;
    TreeNode *left;
    Value node;
    TreeNode *right;
    TreeNode *parent;
}TreeNode;
然后乱七八糟写了一通:
void preL( const TreeNode *root )
  {
    if( !root )
        return;
   
    TreeNode *current = root;
    while( current )
   {    while( current->left )
            current=current->left;

        visitNode( current );
 
        while( !current->right )//回溯
        {
             current=current->parent;
         }
        //这里是访问右边节点的,搞忘了
   }
 }
感觉拖的时间太长了,于是就喊他们来看。
非递归的遇到一个很严重的问题,
就是,访问右边节点 与 回溯 的顺序搞错了。应该先访问右节点,然后再回溯。
郁闷。

一个师兄说直接用goto语句,马上就可以了。想了一下,确实如此。
用goto语句就跟递归的差不多了。
总体而言,这个问题解决的比较失败。

CSDN这几天犯傻了,代码也插不进去~~~