华为面试经验
1.应聘流程
网申>机试>综合测评>专业面试(2轮)>业务主管面试>offer
2.机试(2h)
硬件类:客观题+选择题(满分100,及格60)
实习、提前批(优招)机试通过了,秋招同一岗位可以不用机试
记住这3道题,面试(第一轮专业面)会复盘某一题。
机试成绩:100,200,300,按通过的测试用例百分比,加权计算
比如第一题通过80%,第二题通过20%,则总分为100*80%+200*20% = 120
提前批/秋招的难度比实习的大,相当于力扣的中等难度
刷题:牛客网、力扣
常见题型
递归:LeetCode70、112、509
分治:LeetCode23、169、240
单调栈:LeetCode84、85、739、503
并查集:LeetCode547、200、684
滑动窗口:LeetCode209、3、1004、1208
前缀和:LeetCode724、560、437、1248
差分:LeetCode1094、121、122
拓扑排序:LeetCode210
字符串:LeetCode5、20、43、93
二分查找:LeetCode33、34
BFS:LeetCode127、139、130、529、815
DFS&回溯:LeetCode934、685、1102、531、533、113、332、337
动态规划:LeetCode213、123、62、63、361、1230
贪心算法:LeetCode55、435、621、452
字典树:LeetCode820、208、648
3.综合测评(2h)
俗称性格测试,共36页,每题6个观点(最/较强/中等/弱...)
焦虑指数题:往积极方面选择,要保证前后的题选择基本一致
测评结果会影响秋招
4.面试
实习:专业面(基础+项目),主管面;
秋招:专业面2轮,主管面
穿着合适的服装。现在大部分企业都不要求面试穿正装,但是也不能太休闲或学生气。
非研发要求正装。
4.1自我介绍
1min和3min各准备一个,随机应变。
https://www.zhihu.com/question/19603341
我叫xxx,来自xxxx大学xxxxxxx专业,非常高兴参加咱们xx公司的面试,我想用3个关键词来介绍自己:
第一个是xxxx,主要讲学历背景
第二个是xxxx,主要讲项目经验
最后一个是xxxx,主要讲个人技能及亮点
我对xx很感兴趣, 同时咱们公司是这一行业的龙头企业,非常感谢有机会参加这次面试。 谢谢!
4.2手撕代码
一般20min,对语言卡的不紧,只要编程思想,可以提出换语言解答
难度在力扣的中等难度
实在不知道怎么解答的话,思考后和面试官沟通讨论,尽量展现自己的思路
题目:
leecode49、1019、763、949
最长公共子数组、最长回文字符串、朋友圈的个数—并查集、和为 x 的连续数组、最长公共子序列
4.3智力题
https://zhuanlan.zhihu.com/p/279408335
https://blog.****.net/daaikuaichuan/article/details/90580284
4.4项目
2个项目就足够,是面试最重要的环节
写在简历中的项目,要能回答出基本点(概述、自己负责的工作,最终结果)
准备一个最熟悉的项目,有一两个亮点(深入的技术点),具体介绍一下
4.5主管面
可能会刷人,跟阿里的HR面有点像,一般不问技术(少数除外),主要问生活和个人经历
简单的自我介绍(1-2min)
4.6压力面
主管面运气差的话会出现压力极大的情况。主要体现在主管及其严肃,气场很强,在你回答完之后部分地方直接进行驳斥。我的建议是保持自己的心态,压力面其实本身是个加分的机会。抗压能力在压力面中能够很好的体现。保持自己的思维逻辑,自信的面试状态很重要。
连续无法回答HR的问题,要坚持住,保持自信谨慎的状态
面对难题,说出自己的思路,不一定给出自己的答案,尽可能回答即可
4.7关乎职级
职业规划、反问环节(问面试官)、面试中有自己的亮点
三场面试,每场都会评级(最高A,更优秀的有备注+)
-
职业规划
总体方向:一直做技术专家,或者转技术类管理岗
技术专家型:第1年打基础,第2-3年熟悉业务,第3-5年带小组,之后熟悉整体架构、业务,成为专家。(带具体的时间节点)
转技术类管理型:软件开发>测试(35岁)>管理
-
反问环节
最不推荐:部门业务是什么,因为部门业务其实可以查,直接问业务感觉有点对部门不了解的样子
可以问:进部门之后做什么工作
推荐问:自己前面回答得不好的问题,找相关技术点与HR交流
展现好学的一面:我进公司前需要提前学哪些知识,做什么技术准备
5.面试常见问题
技术类
计算机网络7层模型
应用层:为应用程序提供服务
表示层:数据格式转换、数据加密
会话层:建立、管理、维护会话
传输层:建立、管理、维护端到端的连接
网络层:为数据包选择路由
数据链路层:传输有地址的帧、错误检测
物理层:以二进制数据形式在物理媒体上传输数据
三次握手
建立连接
(1)客户端主动请求建立连接,发送SYN包(同步位SYN=1,序列号seq=x)到服务器端,并进入SYN-SENT状态,等待服务器确认;
(2)服务器端收到客户端发来的SYN包后必须对其进行确认,同时自己也发送SYN包请求连接,即发送ACK+SYN包(确认位ACK=1,同步位SYN=1,确认号ack=x+1,序列号seq=y)到客户端,此时服务器进入SYN-RECEIVED状态;
(3)客户端收到服务器端发来的ACK+SYN包后,向服务器发送确认包(确认位ACK=1,确认号ack=y+1,序列号seq=x+1),此包发送完毕,客户端和服务器端进入ESTABLISHED状态,三次握手完成。
TCP和UDP的区别
UDP 在传送数据之前不需要先建⽴连接,远地主机在收到 UDP 报⽂后,不需要给出任何确认。虽然UDP 不提供可靠交付,但在某些情况下 UDP却是⼀种最有效的⼯作⽅式(⼀般⽤于即时通信),⽐如:QQ 语⾳、QQ 视频、直播等等。
TCP提供⾯向连接的服务。在传送数据之前必须先建⽴连接,数据传送结束后要释放连接。 TCP 不提供⼴播或多播服务。由于 TCP 要提供可靠的、⾯向连接的传输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握⼿来建⽴连接,⽽且在数据传递时,有确认、窗⼝、重传、拥塞控制机制,在数据传完后,还会四次挥手断开连接⽤来节约系统资源),这难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的⾸部增⼤很多,还要占⽤许多处理机资源。 TCP ⼀般⽤于⽂件传输、发送和接收邮件、远程登录等场景。
TCP流量控制
如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗口是rwnd = 400”(这里的rwnd表示receiver window)。因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。请注意:TCP的窗口单位是字节
http://blog.chinaunix.net/uid-26548237-id-3966297.html
HTTP与HTTPS有什么区别
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全;
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。 SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密。
1、https协议需要到CA (Certificate Authority,证书颁发机构) 申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
通过URL地址显示主页的过程
- DNS解析:查找域名的IP地址
- TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报⽂
- 浏览器解析渲染页面
- 连接结束
C语言内存分类
(1)栈(stack):由编译器自动分配释放,存放函数的参数值、局部变量的值、返回地址等,其操作方式类似于数据结构中的栈。
栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{ }”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
(2)堆(heap):一般由程序员动态分配(调用malloc函数)和释放(调用free函数),若程序员不释放,程序结束时可能由操作系统回收。
堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。
(3)数据段(data):存放的是常量、常变量(const 变量)、静态变量、全局变量等。根据存放的数据,数据段又可以分为普通数据段(包括可读可写/只读数据段,存放静态初始化的全局变量或常量)、BSS数据段(存放未初始化的全局变量)。在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 程序结束后由系统释放
(4)常量存储区:常量占用内存,只读状态,决不可修改,常量字符串就是放在这里的。
(5)代码段(code):用于存放程序代码。代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b; //栈中
char s[] = "abc"; //栈中
char *p2; //栈中
char *p3 = "123456"; //123456\0在常量区,p3在栈上
static int c =0; //全局(静态)初始化区
//以下分配得到的10和20字节的区域就在堆区
p1 = (char *)malloc(10);
p2 = new char[20];//(char *)malloc(20);
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
多线程之间如何交换数据
(1)信号量(2)读写锁(3)条件变量(4)互斥锁(5)自旋锁
进程间的通信方式
-
管道/匿名管道(Pipes) :⽤于具有亲缘关系的⽗⼦进程间或者兄弟进程之间的通信。
-
有名管道(Names Pipes) : 匿名管道由于没有名字,只能⽤于亲缘关系的进程间通信。为了克服
这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁
盘⽂件的⽅式存在,可以实现本机任意两个进程通信。 -
信号(Signal) :信号是⼀种⽐较复杂的通信⽅式,⽤于通知接收进程某个事件已经发⽣;
-
消息队列(Message Queuing) :消息队列是消息的链表,具有特定的格式,存放在内存中并由消息
队列标识符标识。管道和消息队列的通信数据都是先进先出的原则。与管道(⽆名管道:只存在
于内存中的⽂件;命名管道:存在于实际的磁盘介质或者⽂件系统)不同的是消息队列存放在内
核中,只有在内核重启(即,操作系统重启)或者显示地删除⼀个消息队列时,该消息队列才会被
真正的删除。消息队列可以实现消息的随机查询,消息不⼀定要以先进先出的次序读取,也可以按
消息的类型读取.⽐ FIFO 更有优势。 消息队列克服了信号承载信息量少,管道只能承载⽆格式
字 节流以及缓冲区⼤⼩受限等缺。 -
信号量(Semaphores) :信号量是⼀个计数器,⽤于多进程对共享数据的访问,信号量的意图在
于进程间同步。这种通信⽅式主要⽤于解决与同步相关的问题并避免竞争条件。 -
共享内存(Shared memory) :使得多个进程可以访问同⼀块内存空间,不同进程可以及时看到对
⽅进程中对共享内存中数据的更新。这种⽅式需要依靠某种同步操作,如互斥锁和信号量等。可
以说这是最有⽤的进程间通信⽅式。 -
套接字(Sockets) : 此⽅法主要⽤于在客户端和服务器之间通过⽹络进⾏通信。套接字是⽀持
TCP/IP 的⽹络通信的基本操作单元,可以看做是不同主机之间的进程进⾏双向通信的端点,简
单的说就是通信的两⽅的⼀种约定,⽤套接字中的相关函数来完成通信过程。
https://www.jianshu.com/p/c1015f5ffa74
Linux的管道原理
管道是一种在两个进程间进行单向通信的机制。因为管道传递数据的单向性,管道又称为半双工管道。数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道);如果要进行双工通信,需要建立两个管道。
管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。
管道的一端连接一个进程的输出。这个进程会向管道中放入信息。
管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。
一个缓冲区不需要很大一般为4K大小,它被设计成为环形的数据结构,以便管道可以被循环利用。
当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。
当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。
当两个进程都终结的时候,管道也自动消失。
https://segmentfault.com/a/1190000009528245
https://blog.****.net/jmppok/article/details/17451261
https://www.cnblogs.com/sallyliu/p/6385806.html
哈希表
如何通过键查找数据地址?
地址index=H(key)
说白了,hash函数就是根据key计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表。
https://blog.****.net/u011109881/article/details/80379505
如何避免地址冲突?
开放地址法:当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。
链地址法:将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
https://www.cnblogs.com/guweiwei/p/6945700.html
数据库索引的作用
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
数据库执行一条语句的过程
SQL语句分为两种,一种是查询,一种是更新(增加,更新,删除):
对于查询语句, 权限校验—》查询缓存—》分析器—》优化器—》权限校验—》执行器—》引擎
select * from tb_student A where A.age=\'18\' and A.name=\' 张三 \';
先检查该语句是否有权限,如果没有权限,直接返回错误信息,如果有权限,在 MySQL8.0 版本以前,会先查询缓存,以这条 sql 语句为 key 在内存中查询是否有结果,如果有直接缓存,如果没有,执行下一步。
通过分析器进行词法分析,提取 sql 语句的关键元素,比如提取上面这个语句是查询 select,提取需要查询的表名为 tb_student,需要查询所有的列,查询条件是这个表的 id=‘1’。然后判断这个 sql 语句是否有语法错误,比如关键词是否正确等等,如果检查没问题就执行下一步。
接下来就是优化器进行确定执行方案,上面的 sql 语句,可以有两种执行方案:
a. 先查询学生表中姓名为“张三”的学生,然后判断是否年龄是 18。
b. 先找出学生中年龄 18 岁的学生,然后再查询姓名为“张三”的学生。
那么优化器根据自己的优化算法进行选择执行效率最好的一个方案(优化器认为,有时候不一定最好)。那么确认了执行计划后就准备开始执行了。
进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎的执行结果。
https://blog.****.net/weter_drop/article/details/93386581
进程调度算法
磁盘调度算法:https://blog.****.net/qq_27607965/article/details/82355797
(1)先来先服务算法(FCFS)
(2)最短寻道时间优先算法( Shortest Seek Time First,SSTF)
(3)扫描算法(SCAN),又称电梯调度算法
(4)循环扫描算法(CSAN)
进程调度算法:
(1)先来先服务算法(first-come first-service,FCFS): 只考虑每个作业的等待时间长短
(2)短作业优先调度算法( Shortest Job First,SJF): 只考虑执行时间的长短
(3)高响应比优先调度算法: 对FCFS方式和SJF方式的一种综合平衡
(4)时间片轮转法: 让每个进程在就绪队列中的等待时间与享受服务的时间成正比例
(5)优先权调度算法(分非抢占和抢占式)
(6)多级反馈队列调度算法: 轮转算法和优先级算法的综合和发展
线程与进程的区别
进程是程序的⼀次执⾏过程,是系统运⾏程序的基本单位,因此进程是动态的。系统运⾏⼀个程序即是⼀个进程从创建,运⾏到消亡的过程。
线程(thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
线程与进程相似,但线程是⼀个⽐进程更⼩的执⾏单位。⼀个进程在其执⾏的过程中可以产⽣多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有⾃⼰的程序计数器、 虚拟机栈和本地⽅法栈,所以系统在产⽣⼀个线程,或是在各个线程之间作切换⼯作时,负担要⽐进程小得多,也正因为如此,线程也被称为轻量级进程。
现在的操作系统都将线程作为最小调度单位,进程作为资源分配的最小单位。 线程也是由系统内核来管理的。调度单位是线程,所以说多个线程可以同时运行在多个CPU核上,但是这也带来一个问题就是,线程切换需要内核的参与。
多核多线程并行需要注意的问题:
1、线程过多:如果系统上的线程数量远远超过核心的数量,那么就会导致频繁的上下文切换,进而降低性能,如缓存污染。通常支持超线程的多核处理器能够使用的线程数最多是物理核心数的2倍,再增加就有可能降低程序的性能;
2、数据竞争:当多个线程读写同一共享数据时,便会产生竞争,需要同步,同步通常会导致线程之间的相互等待,潜在的降低了性能;另一方面,如果不使用同步程序可能无法并行。
3、死锁:线程发生死锁时,处理器都在操作(一直询问需要的资源是否可用),但是线程都在相互等待其他线程释放资源,处于僵持状态。
4、饿死:当一个或多个线程永远没有机会调度到处理器上执行,而陷入永远的等待的状态。
5、伪共享:当多个线程读写的数据映射到同一条缓存线上时,如果一个线程更改了数据,那么其他线程对该数据的缓存就要被失效,,如果频繁地更改数据,硬件就需要不停的更新缓存线,这使性能从独享缓存的水平降低到共享缓存或内存的水平。
https://blog.****.net/ZIV555/article/details/52036841
并发与并行的区别
并发: 同⼀时间段,多个任务都在执行 (单位时间内不⼀定同时执行);
并行: 单位时间内,多个任务同时执行。
物理地址和虚拟地址的区别
现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,
这需要MMU(Memory Management Unit)的支持。MMU通常是CPU的一部分,如果处理器没有MMU,
或者有MMU但没有启用,CPU执行单元发出的内存地址将直接传到芯片引脚上,被 内存芯片
(物理内存)接收,这称为物理地址(Physical Address),如果处理器启用了MMU,
CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address),
而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射
成物理地址。
你的内存只有2G大小,地址从0x00000000到0x7FFFFFFF,你的某个应用程序需要4G的内存,那不足的2G就用虚存补上。
当你访问0x8FFFFFFF地址时,必然没有真正的内存对应,这就经过操作系统暗搓搓的使坏,去硬盘load数据,然后返回给你,骗你说是0x8FFFFFFF地址的数据,就行了。
非技术类
遇到的挫折,如何面对的?
xxx
对华为的了解
华为是一家著名的ICT公司。产业链分布很广。从信息采集的终端,到信息流动的管道(无线网、宽带等),再到最后的云平台处理、智能计算,构成了端管云+智能的整体业务布局。而最近5G技术的领先使得IOT领域重新焕发活力,边缘计算渐渐火热,所以可能之后会变成端 管 云 边+智能。近两年,华为也推出了1+8+N的全场景智慧化战略,(“1”代表手机,是核心;“8”代表PC、平板、智慧屏、音箱、眼镜、手表、车机、耳机;“N”代表摄像头、扫地机、智能秤等外围智能硬件)涵盖了移动办公、智能家居、运动健康、影音娱乐、智慧出行五大场景模式。它和华为的服务及硬件生态平台、AI核心驱动力紧密相连,最终会形成华为跨平台系统、跨平台协同、软硬件协作的强大核心竞争力,组成一个强大、丰富、有秩序的生态。
为什么选择华为
从个人角度而言:华为作为一家IT公司,目前单年的研发投入是全国公司中最高的,说明公司非常重视研发。作为一名研发人员,我必然非常希望能够入职一家对研发很重视的公司。我也知道入职公司会有一对一导师制的培养计划,这都是非常吸引应届毕业生的点。(不妨抛出一些比较实际的因素,比如要留该城市、公司待遇不错之类的)
从大我的角度而言:xxx。
自己的一个缺点
想一个无关紧要的,当然最好是能够衬托自己优点的缺点。比如远景规划比较模糊。
从自己的优点说起,中间加一些小缺点,最后再把问题转回到优点上,突出优点的部分
自己的优势
xxx
身边人对自己的评价
xxx
你对薪资的要求
我对薪资没有过高的要求,我希望通过努力证明我对公司有价值,同时生活问题也必须面对,不能阳春白雪,我只需要这个岗位平均水平的薪资。
加班
如果工作需要我会义不容辞加班,我现在没有任何家庭负担,可以全身心的投入工作。但同时我也会提高工作效率,减少不必要的加班 。
6.签约
offer是你和公司签署的一个录用意向,并不涉学校,所以,对你的约束力不大,同样,对公司的约束力也不大。这意味着,你可以随时不去,而公司也可以随时不要你。所以,如果你非常想去这家单位,一定要和他们签三方,这样才能保证你肯定被录用。
三方协议是应届毕业生与单位、学校签署的正式协议,对单位、学校、个人都有很强的约束力,也是正式的签约形式。三方协议一般一式四份,学生本人一份,学院一份,学校一份,单位一份。学生与单位签署三方协议后盖章,须将其中两份三方协议交至学院、学校处。三方协议会影响最终报到证与档案等的调动。
华为签三方时,是当面签;如果签了再拒,华为来年4月才会解三方,研究所10月底即可悔三方
不过这里还有另外一种情况,就是学校的三方还没发下来,而企业的招人成本高,急着确认求职者的求职意向,所以就会要求应届生先签署两方协议。签署两方协议代表你有意到该公司就职。
简单来说,应届生与企业之间签订的两方协议和三方协议差别不大,只是缺少学校这一方,只有应届生和企业两方,故称两方协议。
7.其他
租房
满堂悦MOMA小区--2100/月,小开间1600/月
西安半导体产业园东边城中村(招待所500/月)
研发和保底
面华为之前,先拿一个offer保底,稳住心态
能研发就研发,研发一直缺人,非研发招的非常少
祝大家都能拿到自己心仪的offer!!!