面试题
在互联网应用中,常常需要将二进制流数据,转换为可以阅读的字符串编码,二进制数据的十六进制表达,就是其中的一种,现在要求使用大写字母和数字来表达一段给定长度的二进制数据,使得表达式这段二进制的编码字符串尽量短。
注意:由于字母1和数字1,字母0和数字0容易混淆,这几个字符和数字不允许出现在编码后的字符串中。
请编写 编码函数 和 解码函数:
将二进制数据进行编码,并返回编码后的结果
bStream[in] 待编码的二进制流
length[in] 待编码的二进制流的数组大小(长度)
res[out]编码后的结果
调用时,如果res为空,调用该函数,返回完全编码后的所需要的字符串的长度,不包含字符串结束符号'\0'
如果res不为空,调用该函数,res中保存的时编码后的结果,函数返回结果编码字符串的长度。
二进制流的编码,一般通过两次调用该函数完成,第一次使res为空,得到应该分配的字符串缓存的长度,更具该长度,为res分配缓存,再次调用更改函数,使得编码后的结果,保存在res中。
虚函数和非虚函数有什么区别?
虚函数用于实现多态,允许在运行使动态选择函数实现。
非虚函数在编译时就确定调用的函数实现,不具备多态性。
静态多态和动态多态有什么区别?
静态多态发生在编译阶段,主要通过函数重载和运算符重载来实现。
动态多态是在运行时解析的多态,通过继承和虚函数来实现。
内存对齐有什么作用呢?
提高内存读取,减少内存碎片,符合硬件要求。
c++对象的大小和什么有关
1.成员变量的大小和对齐。
2.虚函数表的大小。
3.继承关系。
4.编译器和平台。
什么是内存泄漏,怎么避免内存泄漏?
1.正确使用内存分配和释放函数。
2.智能指针。
3.RAII原则。
4.垃圾回收。
5.使用标准容器和数据结构。
6.内存分析工具。
QT中使用配置文件使用了哪个类
Qsettings
你了解dump文件吗?
Dump 文件是一种在程序异常终止或崩溃时生成的文件,它保存了关键的程序内存和状态信息,以帮助开发人员分析问题并进行调试。
当数组越界销毁时回发生什么?
程序崩溃、数据损坏。
c++的三大特性
1.面向对象编程
2.泛型编程
3.底层控制
构造函数可以分为哪几种
1.默认构造函数
2.带参数的构造函数
3.拷贝构造函数
4.移动构造函数
5.隐式构造函数
多线程对于共同资源的访问
互斥锁和信号量
指针和引用的区别
指针是一个变量,引用时一个别名。指针可以为空、改变目标对象、需要额外的内存、可以先不初始化。
有序单链表去重
50个台阶每次1或3
经验与教训
投简历/面试时遇到的坑
1.简历需要写的丰满,但不能够滥用精通掌握之类的词,得严谨(有一部分面试官抓着简历问) 2.简历要扬长避短,不懂的点不能写
如何避开外包公司
1.投简历初期主动找上门的基本是外包 2.投简历前或收到发简历邀请之后百度一下xx公司是不是外包
上家公司如何写
1.有IT行业工作经验的写上家信息
2.没有工作经验的随便挑一个其他城市的IT公司,避开社保公积金等问题
3.写同一城市的公司也可以,但一定确保有人能帮助过背调
4.得熟练说出选定的上家公司工商信息,地点在哪,你住哪,怎么到公司,一般不会这么问,但我在HR面的时候就被这样问到 挂了
算法究竟重不重要
算法很重要,但在有限的时间,如何获得最大的效果?
动态规划,字符串的算法,回溯类算法面试可能考到,但这一类算法往往比较难,机试出现可能性较大
面试真真需要的是掌握简单常用的算法,因为面试时间往往非常有限,一般给到算法题的时间往往最多15min,而面试要在15min内写出很难得算法不太实际,所以面试的算法有以下特点
1.若是遇到难的写起来耗时的算法,只要求描述算法思想,或者给出简单伪代码
2.遇到常见算法,需要自己手敲出来,并且边敲的过程边和面试官说明思路,我为啥要这样做
面试常见的要求手写的算法:二分查找、快速排序、归并排序、堆排序(比较费劲,用于作区分),不调用库函数自己手写处理字符串的算法
若用到力扣,则可能会出现链表或者二叉树的算法,因为链表和二叉树建表建树比较费劲,力扣直接写核心算法就行
刷题推荐:代码随想录 有配套网站 有免费配套视频 讲解详细 难度梯度设置合理
面试时遇到的坑
-
常见考点(个人经历)
-
虚函数和动态多态 频率:几乎必考
-
epoll (水平触发边缘触发,为何用epoll,好在哪)
-
线程间通信和进程间通信
-
问做过的项目及其细节
-
SQL事务 Redis五大数据类型
-
-
面试被问的没答上或答的不理想的问题:
-
你大学的绩点是所少?
-
你们的这个项目(网盘)项目和FTP server有什么区别呢?直接用现成的FTP server不是更好吗?(可以从秒传 断点续传 等一些原生FTP server不具备的功能入手)
-
-
做过两个大项目(网盘和搜索引擎),我该怎么去说,选择哪个项目去说
-
选哪个项目呢?因人而异,但一定要做到的是面试有东西可以说,能够自圆其说
-
关于项目的一些事:面试官压根不知道你做了啥项目,也不知道具体细节,所以能够流畅说,自圆其说就OK
-
网盘项目(一定要掌握)
-
较难的面试点:
-
秒传、断点续传实现细节
-
有现成的FTP server 为何你们公司要开发这个产品
-
epoll的各种难点
-
-
理解起来相对容易,问起来有东西可说,容易做到自圆其说
-
-
搜索引擎项目(尽可能掌握):该项目较为庞大,项目结构就是企业级项目
-
面试点
-
你们的七个库是怎么建立的
-
你们分词是怎么分的
-
说一说simhash/cppjieba原理,了解自然语言处理吗(用到自然语言处理,可不深究)
-
说一说你们关键词推荐是基于什么来实现的(最小距离编辑算法 + 项目文档上的页面排序规则)
-
-
被问到的说不出来怎么办:就说这一部分是同事负责的,但一定要确保自己说出来的那一部分能够自圆其说
-
-
-
C语言部分一些可能被问到的基础问题猜测
-
说一说extern关键字的作用
-
说一说static关键字的作用(static难点在于被static 修饰的变量/函数只在本文件有效,出了本文件无法被访问,多文件时需注意)
-
被问到的超纲的知识:
异步 典型例子 DMA 与之关联又极易混淆的知识点:同步IO和异步IO
大公司和小公司面试比较,区别在哪
小公司:没有那么多时间去培养一个人,更加注重一上手就能干活,就能创造价值的人,小公司面试时更加注重问项目经历,我第一场面试一小时,问项目问了50min
大公司:对于校招和毕业一两年社招人员,尚欠缺开发经验,此时注重的是未来的潜力,大公司甚至愿意给在某一方面欠缺开发建议的小白尝试的机会,面试的过程包括自我介绍 C++基础 项目经历 智力题(5-10min) 算法题(15min左右),不同公司可能不一样 有的算法题也放在后面面试,但大方向一致