C/C++后端实习经验大礼包
文章目录
- C/C++后端实习经验大礼包
- 一、前言
- 二、实习面试宝典
- 1.自我介绍
- 2.深挖个人项目(多个问题不同角度)
- 3.有用过STL吗?常用哪些STL?
- 4.介绍一下你对STL的理解
- 5.深挖STL底层
- 6.Qt有接触过吗?Qt下Tcp通信的整个流程是怎么样的?
- 7.设计模式的问题
- 8.编译原理的简单问题
- 9.讲一下dijkstra算法
- 10.谈一下你对STL的理解
- 11.STL的使用场景
- 12.C++11语法熟悉吗
- 13.工程里面的回溯是什么?
- 14.Widget::Widget(QWidget *parent) :QWidget(parent)什么意思
- 15.算法题:跳台阶(找规律可以发现是个斐波那契数列)
- 16.算法题: 餐厅(区间贪心)
- 17.反问面试官环节
- 三、实习工作分享
- 1.实习专有名词及分析篇
- 1.1SDK:软件开发工具包(Software Development Kit)
- 1.2API:应用程序接口(Application Programming Interface)
- 举例:windows串口通信函数API
- 1.3上位机
- 1.4下位机
- 1.5上位机与下位机区别
- 四、总结
一、前言
这篇文章是C/C++后端实习经验大礼包的第一弹,后面会持续更新,谢谢大家支持~~撒花,前面说过博主目前在一家互联网公司实习,今天给大家带来第一弹C/C++后端实习经验大礼包,希望大家喜欢。
二、实习面试宝典
流程:投简历->简历筛选->技术电话面->技术视频面->hr面(有些公司可能在中间环节比较多,比如两次技术电话面,两次技术视频面等,视频面多为主管之类的,ps:主管面会参考之前的部门对你面试的评价)
1.自我介绍
2.深挖个人项目(多个问题不同角度)
3.有用过STL吗?常用哪些STL?
回答:用过,平时用的比较多,常用vector,map,unordered_map,stack,queue,deque,set,multiset,unordered_set,priority_queue,bitset,list之类的
4.介绍一下你对STL的理解
回答:STL就是标准模板库,可以提高程序的开发效率和复用性。
5.深挖STL底层
vector:底层存储是一个可变大小的数组,支持O(1)的随机访问,在尾部之外的位置插入和删除操作时间复杂度是 O(n);
deque:双端队列,支持O(1)随机访问在头部和尾部之外的位置插入和删除的时间复杂度是O(n);
list: 双向链表,不支持随机访问,只支持顺序访问,在任意位置的插入和删除速度很快;
forward_list:单向链表;
array是固定大小的数组(vector是可变大小的数组);
string:与vector类似,可以理解为特殊的vector,专门用来存储字符,支持随机访问,在尾部之外的位置插入的时间复杂度是O(n);
6.Qt有接触过吗?Qt下Tcp通信的整个流程是怎么样的?
有的,主要从服务器端和客户端两方面介绍:
1.服务器端
创建用于监听的套接字(Socket)
Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。
给套接字设置监听
如果有连接到来, 监听的套接字会发出信号newConnected
接收连接, 通过nextPendingConnection()函数, 返回一个QTcpSocket类型的套接字对象(用于通信)
使用用于通信的套接字对象通信
1 发送数据: write
2. 接收数据: readAll/read
客户端方面:
创建用于通信的套接字
连接服务器: connectToHost
连接成功与服务器通信
1 发送数据: write
2.接收数据: readAll/read
7.设计模式的问题
后面我会专门写文章来讲
8.编译原理的简单问题
后面我会专门写文章来讲
9.讲一下dijkstra算法
回答:。dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。
时间复杂度:朴素版写法O(V方) 进阶写法:基于优先队列的写法(适用于稀疏图)总复杂度为 O(V log E)
Edge:边 Vertex:顶点
10.谈一下你对STL的理解
C++ STL 做为C++的一个标准类库,包含了复用性最高的数据结构(容器)与算法(模板函数)。
STL的容器可以分为以下几个大类:
一:序列容器,有vector, list, deque,string.
二:关联容器可以分为 set(集合)和 map(映射表)两大类,及其衍生体 multiset 和 multimap。这些容器的底层机制均以 RB-tree(红黑树)实现。RB-tree 也是一个独立容器,但并不开放使用。
SGI STL 还提供一个不在标准规格的关联式容器 hash_table(散列表),以及以 hash_table 为底层机制而完成的 hash_set散列集合、hash_map散列映射表、hash_multiset散列多键集合、hash_multimap散列多键映射表。
关联容器,类似关联式数据库,每个元素都有一个键值key和一个实值value。关联式容器的内部结构是一个平衡二叉树,包括 AVL-tree、RB-tree、AA-tree,STl 中运用的是 RB-tree红黑树。
11.STL的使用场景
vector(可变长的动态数组)适用场景:需要快速查找,不需要频繁插入/删除的场景
string:string 类型支持长度可变的字符串,实际上就是vector,便于程序员操作字符串的类库。
也可以认为string是一个类:string封装了char* ,管理这个字符串,是一个char* 型的容器;
array:数组 使用场景:类似vector,比数组更安全(不担心越界),但是内容在栈上,且属于定长容器。
deque:(double-ended queue,双端队列)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
使用场景:头尾增删元素很快,随机访问比vector慢一点,因为内部处理堆跳转。中间插入和删除效率交较高。但因为他是list和vector的结合体,出场次数不多。
forward_list:使用场景:需要list的优势,但只要向前迭代
list:需要频繁插入/删除,不需要快速查找
queue:FIFO(先进先出)~( First Input First Output)。底层容器可以是list或deque。
set/multiset:需要元素有序,查找/删除/插入性能一样。红黑树效率都是O(logN)。即使是几个亿的内容,最多也查几十次。
map/multimap 映射/多重映射:需要key有序将值关联到key,O(logN)查找/删除/插入性能一样
12.C++11语法熟悉吗
回答:还行,之后问了std::function,我回答是std::function是一个函数包装模板,可以包装下列这几种可调用元素类型:函数、函数指针、类成员函数指针或任意类型的函数对象(例如定义了operator()操作并拥有函数闭包)。std::function对象可被拷贝和转移,并且可以使用指定的调用特征来直接调用目标元素。当std::function对象未包裹任何实际的可调用元素,调用该std::function对象将抛出std::bad_function_call异常。
13.工程里面的回溯是什么?
回答:用git一直备份版本有需要就回退一下
14.Widget::Widget(QWidget *parent) :QWidget(parent)什么意思
由于构造函数是指在创建一个新对象的时候,自动执行,因此通常用来实现一些默认操作。
此处“Widget::Widget(QWidget *parent) ”定义派生类的构造函数;
:QWidget(parent)基类的有参构造函数
最终达到:调用基类的有参构造函数,实现对象树上基类的功能
15.算法题:跳台阶(找规律可以发现是个斐波那契数列)
一个楼梯共有 n 级台阶,每次可以走一级或者两级,问从第 0 级台阶走到第 n 级台阶一共有多少种方案。
输入格式
共一行,包含一个整数 n。
输出格式
共一行,包含一个整数,表示方案数。
数据范围
1≤n≤15
输入样例:
5
输出样例:
8
#includeusing namespace std;int a=1,b=2,c;int main(){int n;cin>>n;int w=n-2;if(n==1) cout<<1;else if(n==2) cout<<2;else{while(w--){c=a+b;a=b,b=c;}cout<<b;}}
16.算法题: 餐厅(区间贪心)
一家餐厅收到了 n 个客人的预约订单。
每个订单都有开始时间和结束时间。
对于每个订单,餐厅有权利接单,也有权利拒单。
接受的订单,两两之间不得有任何时间交集,甚至不得有时刻交集,即如果一个订单的开始时间和另一个订单的结束时间相同,则两订单也不得同时接受。
为了赚更多钱,餐厅需要尽可能多的接单。
请问,餐厅最多可以接多少单?
输入格式
第一行包含一个整数 n。
接下来 n 行,每行包含两个整数 l,r,表示一个订单的开始时间和结束时间。
输出格式
输出可以接受的最大订单数量。
数据范围
1≤n≤5×105,
1≤l≤r≤109
输入样例1:
2
7 11
4 7
输出样例1:
1
输入样例2:
5
1 2
2 3
3 4
4 5
5 6
输出样例2:
3
输入样例3:
6
4 8
1 5
4 7
2 5
1 3
6 8
输出样例3:
2
#includeusing namespace std;struct node{int l,r;};int n;bool cmp(node x,node y){return x.r<y.r;}int main(){cin>>n;node a[n+1];int i;for(i=0;i<n;i++){cin>>a[i].l>>a[i].r;}sort(a,a+n,cmp);int temp=a[0].r;int tot=1;for(i=1;i<n;i++){if(a[i].l>temp){temp=a[i].r;tot++;}}cout<<tot;}
17.反问面试官环节
自由发挥即可,可以提前准备一些大众问题和自己关心的问题。
三、实习工作分享
1.实习专有名词及分析篇
实习中你肯定会接触到很多自己没不熟悉的名词,在这里算法小学徒给大家分享一些cpp后端专有名词的解释:
1.1SDK:软件开发工具包(Software Development Kit)
软件开发工具包一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。
SDK相当于是一个开发者集成的环境,作为APP供应链中重要的一环,在提升App兼容性和灵活性、节约开发成本方面表现卓著。一个产品想实现某些特定功能如消息推送,便可以找到相关的第三方SDK,工程师直接接入SDK,不用再重新开发。这样,工程师可以将更多的时间和精力投入到其他产品业务相关功能的开发上。
1.2API:应用程序接口(Application Programming Interface)
API又称为应用编程接口,就是软件系统不同组成部分衔接的约定。由于近年来软件的规模日益庞大,常常需要把复杂的系统划分成小的组成部分,编程接口的设计十分重要。程序设计的实践中,编程接口的设计首先要使软件系统的职责得到合理划分。良好的接口设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的维护性和扩展性。
简单地说:API就是接口,就是通道,负责一个程序和其他软件的沟通,本质是预先定义的函数。
举例:windows串口通信函数API
1.CreateFile – 打开串口;
2.SetupComm-初始化一个指定的通信设备的通信参数
3.ReadFile – 读数据;
4.WriteFile – 写数据;
5.CloseHandle – 关闭串口;
6.GetCommState – 取得串口当前状态;
7.SetCommState – 设置串口状态;
8.PurgeComm – 清除串口缓冲区 ;
9.ClearCommError – 清除串口错误或者读取串口现在的状态;
10.SetCommMask – 设置串口通信事件;
1.3上位机
上位机是指可以直接发出操控命令的计算机。
1.4下位机
下位机是直接控制设备获取设备状况的计算机。
1.5上位机与下位机区别
1.上位机一般是集中管理监控机,下位机是指现场直接控制器或控制机。上位机面向管理级用户,下位机面向底层设备控制。
2.上位机:上位监视系统,一般为计算机系统(监控软件;下位机:控制系统的现场执行系统,一般为PLC等设备。
3上位机是指工业控制中位于较高层次的计算机,一般是指电脑;而下位机是直接控制设备获取设备状况的的计算机,一般是指PLC/单片机之类的。
4.经验:通常工控机,工作站,触摸屏作为上位机;而通信控制PLC,单片机等作为下位机,从而控制相关设备元件和驱动装置。
四、总结
后面博主会继续为大家带来 C/C++后端实习经验大礼包的其他内容,希望大家喜欢,撒花~~,另外根据博主的亲身实习经验,自学能力不管是面试还是实习过程中都非常受青睐, 程序员行业是一个需要终身学习的行业,大部分时间别人教你的东西只能作为一个参考,而且自学这种能力可以让人感觉到了无限的可能和创造性,跨越认识边界,不受限制的感觉真的很奇妙
每日一句:不是因为有希望才去努力,而是努力了,才能看到希望。成功重在努力与坚持,抓住时机,就趁现在!与大家共勉!!!