时间:2019.6.27日10点
面试步骤:填写基本信息——hr问问题——笔试和机试
1.填写基本信息:
这个信息表是用来给hr评分的,我在填写的过程中看到后面的评分项目:仪容仪表,沟通能力,专业能力,岗位契合,这四项满分各十分。
从这里我们可以看出在面试的时候穿正式一点是很重要的,既能给hr一个好印象还能让自己的评分高一点。
2.hr问问题:
- 首先自我介绍
- hr寻问专业知识
- hr寻问我认为学校的培养方案有哪些需要改进的
- hr寻问我在当班长的过程中有什么收获,为什么想当班长
- hr寻问我在当班长的期间为班级氛围带来了怎么样的变化
本人由于在前段时间一直在刷算法题,所以对于简答题我几乎没能答上来,都是些常见的题目,以下是hr问的专业知识点:
- 线程与进程的区别:
一.定义不同
1.进程是什么:进程是有一定独立功能的程序,是系统进行资分配和调度的一个独立单位,重点在系统调度和独立单位,说明进程是一个可以独立运行的程序
2.线程是什么:线程是进程的一个实体,是cpu调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,在运行时,知识暂用一些计数器,寄存器和栈
二.两者的联系
1.一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有个线程(就是通常说的主线程)
2.资源分配给进程,同一进程的所有线程共享该进程的所有资源
3.线程在执行过程中,需要协同同步。不同进程的线程需要通过消息通讯的办法实现同步
4.处理机分给线程,即真正在处理机上运行的是线程
5.线程是进程内的一个执行单元,也是进程内的可调度实体
三.从三个角度来剖析两者的区别:
1.调度:线程作为调度和分配的基本单位,而进程作为拥有资源的基本单位
2.并发性:不仅进程之间可以并发执行,同一个进程的多个线程也可以并发执行
3.拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属的进程资源
- 数据结构中堆和栈的区别:(当时hr直接问的是堆和栈的区别估计问的不是数据结构的。。。)
堆和栈是两种不同的数据结构。两者都是数据项按序排列的数据结构
栈:像是装数据的桶或者箱子
它具有后进先出的特性的数据结构,也就是说后面存放的先取,这就相当于我们取放在箱子底部的东西,我们首先要移开它上面的东西
堆:像是一颗倒立的大树
堆是一种经过排序的树形结构(是一颗完全二叉树),每个节点都有值。堆的节点是根节点的值最大最小(分为大根堆和小根堆)。由于堆的这个特性,常用来实现优先队列,堆的存取是随意的。可以直接取到我们想要的数据。
- 内存中的堆和栈的区别
栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值。其操作方式类似数据结构中的栈。
堆区(heap):一般由程序员释放。
内存中的栈区处于相对较高的位置,以地址增长方向为上的话,栈地址是向下增长的。栈中分配局部变量
堆区是向上增长的用于分配程序员申请的空间。
申请方式和回收方式不同:
系统会为局部变量在栈中自动开辟空间,一旦运行完后就自动释放不可以再访问。而堆的空间是开辟程序员自己申请的空间,堆上的数据只要程序员不释放,就可以一直访问到。
申请后的响应:
栈:只要剩余的空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出
堆:堆中会有一个记录空闲内存地址的链表,当系统收到程序的申请,会遍历链表寻找第一个空间大于申请空间的堆。然后将符合的节点从空闲链表中删除。分配后将多以的空间再插入空闲链表。
申请效率不同:
栈:由系统自动分配,速度较快。但程序员无法控制
堆:用new分配内存,速度较慢,容易产生内存碎片,不过用起来最方便
申请大小的限制:
栈:在windows下,栈是向低地址扩展的数据结构,是一快连续的内存区域。而栈顶的地址和栈的最大容量是由系统预先定义好的。
堆:堆是向高地址扩展的,是不连续的内存区域。这是由于系统是用链表来存储空闲块地址,自然是不连续的。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活。
堆和栈的内存内容:
栈:函数调用的时候:第一个进栈的是主函数中函数调用后的下一条指令的地址,然后是各个参数进栈(从右往左),然后是各个参数。出栈的顺序就按照栈的特性,先进后出。
堆:堆的头部用一个自己存放堆的大小,其他内容由程序员安排。
3.友元函数和内联函数:
友元函数:关键字friend,定义在类外部,有权访问类的所有私有成员和保护成员。尽管友元函数在类中的定义出现过,但是友元函数并不是成员函数
内联函数:关键字inline,是用空间换时间的做法,省去函数调用的开销,所以代码很长的或者有循环递归的函数不适合用内联。内联只是对编译器的一个建议,若函数题有循环或递归则编译器会忽略内联。inline必须和函数定义放在以前,仅仅放在函数声明是不起作用的。定义在类中的成员函数默认定义为内联函数。
4.引用和多态的关系
引用是除指针另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。
class A;
class B:public A{……};
B b;
A &Ref = b; // 用派生类对象初始化基类对象的引用
ref只能用来访问派生类对象中从基类继承下来的成员,是基类引用指向派生类。如果A中定于有虚函数,并且在B
类中写了虚函数,就可以产生多态效果。
3.笔试和机试题目:
删除链表的倒数第二个元素:
思路:
一个指针指向头 p=head;
一个指针指向 k=head->next->next;
两个指针一起往前走,当走到最后一个节点时,p就指向倒数第三个节点
void remove2thfromend(node *&head)
{
node *p=head;
node *k=head->next->next;
if(k==NULL)
{
head=head->next;
}
else
{
while(k->next)
{
p=p->next;
k=k->next;
}
node *temp=p->next;
p->next=k;
}
}
进阶:删除倒数第n个链表节点
更多链表操作:最全的链表操作
合并两个无序数组:
思路:
先将两个数组排序,后再合并
vector<int> combination(vector<int> &a,vector<int> &b)
{
sort(a.begin(),a.end());
if(b.size()==0)
return a;
sort(b.begin(),b.end());
if(a.size()==0)
return b;
vector<int> res;
int i=0;
int j=0;
for(;i<a.size()&&j<b.size();)
{
if(a[i]<b[j])
{
res.push_back(a[i]);
i++;
}
else
{
res.push_back(b[j]);
j++;
}
}
if(i<a.size())
{
for(;i<a.size();i++)
res.push_back(a[i]);
}
if(j<b.size())
{
for(;j<b.size();j++)
res.push_back(a[j]);
}
return res;
}
将数组元素第一个和倒数第一个交换,第二个和倒数第二个交换,以此类推(典型的双指针问题)
void exchange(vector<int> &a)
{
int i=0;
int j=a.size()-1;
while(i<j)
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
i++;
j--;
}
}