首先介绍了一下公司,然后让我自己介绍了一下。我介绍的比较简单。就说最大的优点在于做事比较认真,
如果我想做一个事情,我会在我能力范围内把它做得最好。然后就没说什么了。随即转入正题。
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这几天犯傻了,代码也插不进去~~~