原文地址:大恒图像面经(算法研发工程师)
作者:yigerenjiandan
2012年8月30日下午3:00来到大恒图像公司,公司职员给了一份笔试,紧接着就是面试。其中最搞笑的是我正在做笔试题,他们居然在单位里做第八套广播体操,不过还是要赞一个的,感觉挺不错的。下面就跟大家分享一下大恒图像的笔试题。我面的是算法工程师,笔试题都是很基本的题,可是我答的很烂,主要是因为准备补充分吧
1、C语言题,主要考察宏替换、变量的作用域以及逻辑运算的,挺简单的,不过还是有很多陷阱的;
2、用C++编写一程序,判断操作系统是16位还是32位;
- <span
style="font-family:Arial;color:#333333;">16位的系统下, - int
i = 65536; - cout
<< i; // 输出0; - int
i = 65535; - cout
<< i; // 输出-1; -
- 32位的系统下,
- int
i = 65536; - cout
<< i; // 输出65536; - int
i = 65535; - cout
<< i; // 输出65535;</span>
3、两个循环链变A和B,头指针分别是pHeadA,pHeadB,删除链表中相同的元素data;
有双向循环链表结点定义为:
struct node
{ int data;
struct node *front,*next;
};
有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
BOOL DeteleNode(Node *pHeader, DataType Value)
{
if (pHeader == NULL) return;
BOOL bRet = FALSE;
Node *pNode = pHead;
while (pNode != NULL)
{
if (pNode->data == Value)
{
if (pNode->front == NULL)
{
pHeader = pNode->next;
pHeader->front = NULL;
}
else
{
if (pNode->next != NULL)
{
pNode->next->front = pNode->front;
}
pNode->front->next = pNode->next;
}
Node *pNextNode = pNode->next;
delete pNode;
pNode = pNextNode;
bRet = TRUE;
//不要break或return, 删除所有
}
else
{
pNode = pNode->next;
}
}
return bRet;
}
void DE(Node *pHeadA, Node *pHeadB)
{
if (pHeadA == NULL || pHeadB == NULL)
{
return;
}
Node *pNode = pHeadA;
while (pNode != NULL)
{
if (DeteleNode(pHeadB, pNode->data))
{
if (pNode->front == NULL)
{
pHeadA = pNode->next;
pHeadA->front = NULL;
}
else
{
pNode->front->next = pNode->next;
if (pNode->next != NULL)
{
pNode->next->front = pNode->front;
}
}
Node *pNextNode = pNode->next;
delete pNode;
pNode = pNextNode;
}
else
{
pNode = pNode->next;
}
}
}
struct node
{ int data;
struct node *front,*next;
};
有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
BOOL DeteleNode(Node *pHeader, DataType Value)
{
if (pHeader == NULL) return;
BOOL bRet = FALSE;
Node *pNode = pHead;
while (pNode != NULL)
{
if (pNode->data == Value)
{
if (pNode->front == NULL)
{
pHeader = pNode->next;
pHeader->front = NULL;
}
else
{
if (pNode->next != NULL)
{
pNode->next->front = pNode->front;
}
pNode->front->next = pNode->next;
}
Node *pNextNode = pNode->next;
delete pNode;
pNode = pNextNode;
bRet = TRUE;
//不要break或return, 删除所有
}
else
{
pNode = pNode->next;
}
}
return bRet;
}
void DE(Node *pHeadA, Node *pHeadB)
{
if (pHeadA == NULL || pHeadB == NULL)
{
return;
}
Node *pNode = pHeadA;
while (pNode != NULL)
{
if (DeteleNode(pHeadB, pNode->data))
{
if (pNode->front == NULL)
{
pHeadA = pNode->next;
pHeadA->front = NULL;
}
else
{
pNode->front->next = pNode->next;
if (pNode->next != NULL)
{
pNode->next->front = pNode->front;
}
}
Node *pNextNode = pNode->next;
delete pNode;
pNode = pNextNode;
}
else
{
pNode = pNode->next;
}
}
}
4、给你一幅图像的指针img、图像的长和宽heigth、width,以及灰度直方图指针hist
要有C语言用
for(i=0;i<256;i++) { hist[i]=0; } for(i=0;i<Height;i++) for(j=0;j<Width;j++) { img=(unsigned char*)img+Width*i+j; hist[*img]++; } 5、图像的滤波、卷积、平滑以及图像边缘化的区别和联系
图像滤波,即在尽量保留图像细节特征的条件下对目标像的噪声进行抑制;
图像卷积,是图像变得光滑,降低图像中的噪声
图像平滑,是指用于突出图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频成分,使图像亮度平缓渐变,减小突变梯度,改善图像质量的图像处理方法。
图像边缘化,
6.修改程序的bug,并对程序进行优化,主要bug是图像指针的问题,对符合条件的像素点进行处理,主要是利用两个循环,对像素的索引不对,以及表达式不对;
7.题目没有看懂,就是关于相机和图像高亮部分的处理;
笔试完直接就面试,估计被BS的,至今没戏,主要是笔试做的太烂了!最重要的是忘了把试卷照下来,这是个遗憾。