前几天出去面试了一下,很简单的问题但是自己答得并不好,我是学电气专业的属于半路出家
,面试官都问的很基础。今天终于下狠心来总结一下这次的面试,接下来会陆续推出两三篇博客重点解释这几个知识点,希望和大家一起提高自己。好了切入正题,先说一下被问到的知识点。
![大哭](http://static.blog.csdn.net/xheditor/xheditor_emot/default/wail.gif)
面试官:1、自我介绍一下
2、先写一个strlen函数吧(面试官喜欢考基础,心里窃喜,刚复习过其实很简单),代码写完以后面试官问我能不能不用计数器实现,当时没想出来,
现在想出来三种写法,稍后会发出来分享。
3、再写一个strcpy函数
4、写一个
二分查找
5、写一个单链表的逆置(这个我记得《剑指offer》有,我用stack实现了一下,因为感觉头插有点简单怕面试官不满意,结果面试官就想看头插)
6、代码写的差不多了,现在再问一点基础知识,你说一下C++面向对象的特性,多态是怎么实现的(重点)
7、为什么要有动态内存管理,了不了解RAII(重点)
面试官就问了我大概这几个问题,我的代码只能说写的不是很差,基本都写出来了,但是后面的概念答得就比较差,这些问题都在一些书上出现过,我也背的差不多,但是面试官
要我答出自己的理解的时候就一无所知,看来还是不能死记硬背啊,我后来把这些问题都弄懂了,尤其是多态的实现和动态内存管理这块,我会以一个知识点一片博客的形式展示出来,因为内容确实有点多。最后告诫大家如果要找工作的话,切记一定要把书上的知识点自己搞懂,往下挖掘实现原理,只有对知识的掌握有深度才能经得住问。
好了,我现在从自我介绍开始给大家分析一下我此次的面试,希望大家也可以评论一下
。虽然我准备了一分钟的自我介绍但是面对面试官的时候还是有点紧张,毕竟第一次面试。
![大笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
1、自我介绍
:“学长你好!我叫胡刚,是陕西科技大学2014级电气与信息工程学院的一名大三的学生,虽然我的专业是电气工程及其自动化,但是我在大学的主要爱好是编程,为此我还参加过一些比赛,取得过一定的名次,这也更加坚定了我往编程这方面发展,今天我面试的岗位是C/C++研发工程师”,当时说到自己是电气工程专业的学生的时候明显底气不足,有点磕绊。
面试官:说一下你参加了哪些编程比赛,取得过哪些名次?
我:我参加过学校举办的C语言编程比赛,取得过第二名的成绩
以上就是我的自我介绍和面试官随后的问题,我总结了一下。首先和面试官打招呼称他为学长比较有亲切感,其次自己在介绍的时候有点紧张,不敢看面试官,表现的不自信。然后自己把应聘的岗位放在最后说不好,应该放在前面说,希望大家引以为戒。
2、
strlen
的实现
这里我给大家提供三种写法,其中前两种比较简单但都有坑,第三种最好也掌握,因为你可以用递归实现的话,面试官一定比较欣赏你。
//使用计数器
int My_strlen1(const char* src)
{
int count=0;
assert(src);
while(*src++)
count++;
return count;
}
//用指针-指针
int My_strlen2(const char* src)
{
const char* pHead=src;
assert(src);
while(*src++)
;
return src-pHead-1;
}
//使用递归实现
int My_strlen3(const char* src)
{
if(*src=='\0')
return 0;
return My_strlen3(++src)+1;
}
注意:这里把assert放到变量定义之后,仅仅是因为要通过编译,在面试的时候要写在前面。
2、strcpy的实现,这个函数实现有个坑就是它的返回值是char*,原因是为了实现链式访问,还有大家写参数的时候最好把destination写在前面,把source写在后面,并且把source定义为const
char* My_strcpy(char* dst,const char* src)
{
char* address=dst;
assert(src&&dst);
while((*dst++) = (*src++))
;
return address;
}
3、实现二分查找
//默认数列按升序排列
int BinarySerch(int* arr,unsigned int size,int key)
{
int left=0;
int right=size-1;
int mind=left+(right-left)/2;//避免数组太长超过int的范围
assert(arr);
while(left<right)
{
if(arr[mind]==key)
return mind+1;
else if(arr[mind]<key)
left=mind+1;
else
right=mind-1;
mind=left+(right-left)/2;//避免数组太长超过int的范围
}
printf("key is not in arr");
return -1;
}
4、单链表的逆置
typedef struct ListNode
{
int m_data;
struct ListNode* m_Next;
}ListNode;
typedef struct list
{
struct ListNode* phead;
}list;
void PushBack(list **ls,int data)
{
if((*ls)->phead==NULL)
{
(*ls)->phead=(ListNode*)malloc(sizeof(ListNode));
(*ls)->phead->m_data=data;
(*ls)->phead->m_Next=NULL;
}
else
{
ListNode* cur=(*ls)->phead;
ListNode* pre=NULL;
while(cur!=NULL)
{
pre=cur;
cur=cur->m_Next;
}
cur=(ListNode*)malloc(sizeof(ListNode));
pre->m_Next=cur;
cur->m_data=data;
cur->m_Next=NULL;
}
}
//头插
ListNode* Reverse(ListNode* phead)
{
ListNode* pre=NULL;
ListNode* cur=phead;
ListNode* next=NULL;
while(cur)
{
next=cur->m_Next;
cur->m_Next=pre;
pre=cur;
cur=next;
}
return pre;
}
void DisplayList(ListNode* list)
{
ListNode* cur=list;
while(cur!=NULL)
{
printf("%d ",cur->m_data);
cur=cur->m_Next;
}
printf("\n");
}
void Destroy(list* ls)
{
ListNode* cur=ls->phead;
ListNode* del=NULL;
while(cur)
{
del=cur;
cur=cur->m_Next;
free(del);
}
}
void TestReverseList()
{
list *ls;
ListNode* cur=NULL;
ls=(list*)malloc(sizeof(list));
ls->phead=NULL;
PushBack(&ls,1);
PushBack(&ls,2);
PushBack(&ls,3);
PushBack(&ls,4);
DisplayList(ls->phead);
cur=Reverse(ls->phead);
DisplayList(cur);
Destroy(ls);
}
以上就是我的这次面试题的前四道题的代码实现,其中的几道题代码实现并不仅限于我的版本,在这里分享出来仅供参考,对于最后两道概念题我会再写两篇博客分享。