第一次面试经历--慧扬健康

本文详细记录了作者2019年6月27日的慧扬健康面试经历,包括面试流程:填写基本信息、HR提问、笔试及机试。在面试过程中,HR关注仪容仪表、沟通能力、专业能力和岗位契合度。面试问题涉及线程与进程、堆与栈的区别、友元函数、内联函数、引用与多态的关系等专业知识点,以及链表操作和合并无序数组的题目。
摘要由CSDN通过智能技术生成

时间:2019.6.27日10点


面试步骤:填写基本信息——hr问问题——笔试和机试

1.填写基本信息:

这个信息表是用来给hr评分的,我在填写的过程中看到后面的评分项目:仪容仪表,沟通能力,专业能力,岗位契合,这四项满分各十分。

从这里我们可以看出在面试的时候穿正式一点是很重要的,既能给hr一个好印象还能让自己的评分高一点。

2.hr问问题:
  • 首先自我介绍
  • hr寻问专业知识
  • hr寻问我认为学校的培养方案有哪些需要改进的
  • hr寻问我在当班长的过程中有什么收获,为什么想当班长
  • hr寻问我在当班长的期间为班级氛围带来了怎么样的变化

本人由于在前段时间一直在刷算法题,所以对于简答题我几乎没能答上来,都是些常见的题目,以下是hr问的专业知识点:

  1. 线程与进程的区别:
一.定义不同
1.进程是什么:进程是有一定独立功能的程序,是系统进行资分配和调度的一个独立单位,重点在系统调度和独立单位,说明进程是一个可以独立运行的程序
2.线程是什么:线程是进程的一个实体,是cpu调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,在运行时,知识暂用一些计数器,寄存器和栈

二.两者的联系
1.一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有个线程(就是通常说的主线程)
2.资源分配给进程,同一进程的所有线程共享该进程的所有资源
3.线程在执行过程中,需要协同同步。不同进程的线程需要通过消息通讯的办法实现同步
4.处理机分给线程,即真正在处理机上运行的是线程
5.线程是进程内的一个执行单元,也是进程内的可调度实体

三.从三个角度来剖析两者的区别:
1.调度:线程作为调度和分配的基本单位,而进程作为拥有资源的基本单位
2.并发性:不仅进程之间可以并发执行,同一个进程的多个线程也可以并发执行
3.拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属的进程资源
  1. 数据结构中堆和栈的区别:(当时hr直接问的是堆和栈的区别估计问的不是数据结构的。。。)
堆和栈是两种不同的数据结构。两者都是数据项按序排列的数据结构
栈:像是装数据的桶或者箱子
它具有后进先出的特性的数据结构,也就是说后面存放的先取,这就相当于我们取放在箱子底部的东西,我们首先要移开它上面的东西

堆:像是一颗倒立的大树
堆是一种经过排序的树形结构(是一颗完全二叉树),每个节点都有值。堆的节点是根节点的值最大最小(分为大根堆和小根堆)。由于堆的这个特性,常用来实现优先队列,堆的存取是随意的。可以直接取到我们想要的数据。
  1. 内存中的堆和栈的区别
栈区(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--;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈乐乐happy

觉得对你有用的话可以打赏打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值