C++春招实习和秋招面试过程记录
2.22
1.数据为什么放文件里或者数据库里,放在内存中不行吗?
如果是定期更新的,一段时间内都在使用,放在内存中可以的,速度更快的。
2.说说C++的4种类型转换
C++的四种类型转换reinterpret_cast/const_cast/static_cast /dynamic_cast
3.C++里map的底层实现的方式,unordered_map和map插入一个数据的复杂度对比
map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。
unordered_map: unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的。哈希表详细介绍
unordered_map以前就是hash_map,结合了hashtable的一个结构。
unordered_map内部是非排序的、map是排序了的。unordered_map插入一个数据的复杂度是O(1),map插入一个数据的复杂度是O(logn),插入n个元素的话复杂度是O(nlogn)。
map和unordered_map的差别和使用
4.在Linux上一个电话本文件里查找指定手机号码
可以Shell依次读每一行然后对比即可。或者使用grep。
3.2
1.虚拟存储
一定要提到 程序的局部性原理
2.rand7()产生rand10()的随机数
470. Implement Rand10() Using Rand7()
3.计算100的阶乘
C++ 求100的阶乘
3.4
1.tcp四次挥手
tcp建立连接为什么需要三次握手,四次挥手过程
这个我讲的没错,就是4次,A和B双方各自一来一回,面试官说我说的不对,我紧张了,应该再和他问清楚的,这个问题我是知道的。紧张了紧张,应该把这个问题问清楚,面试说我说的不对,但我是知道的。
他说A先发FIN报文,最后谁会ACK,我说B肯定要回ACK,但如果说4次挥手,最后谁发ACK,那肯定还是A发。这里应该和他说清楚的,有点后悔,他以为我不懂。
2.进程间通讯方式
我只回答出了:管道,消息队列,信号量,共享内存,少了个socket通信。
(1) 半双工Unix管道
(2) FIFOs(命名管道)
(3) 消息队列
(4) 信号量
(5) 共享内存
(6) 网络Socket
另外他问哪种方式效率最高,应该是指速度,我说共享内存,应该是没说错。
几种方式的比较:
管道:速度慢,容量有限
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
信号量:不能传递复杂消息,只能用来同步
共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了一块内存的。
3.InnoDB的索引方式
这块我确实不懂,MySQL的InnoDB索引原理详解,但这个确实没怎么用过和了解过,再看看吧。这篇文章也不错阿里一面,给了几条SQL,问需要执行几次树搜索操作?
InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。
MySQL索引原理,一篇从头到尾讲清楚
4.计算一个浮点数double的幂次方,考虑边界情况。 优化
主要边界就是:0的小于等于0的次方,都是非法的,应该报错
计算一个浮点数double的幂次方,好好品品。
额外的点:
a.非法情况用C++的异常处理机制,我说打印出一句话,这样是不行的,因为如果在没有屏幕的机器或者没有输出,面试官说CPU上。但是异常是个好东西,我直接printf肯定也是能看出来的,如果输出一句话都看不到,那肯定是不可能的,但是用异常机制是很专业的,没问题。C++异常怎么写
b.double在内存中具体是怎么存放的
浮点数double在内存中的存储方式
5.实现一种数据结构,先进后出,入和出,以及取最小值,时间复杂度都是O(1)。
才发现这题我2019年做过Leetcode 155. Min Stack实现一个栈,要求实现出栈,入栈,返回最小值的操作,时间复杂度为O(1)
实现一个栈,要求实现出栈,入栈,返回最小值的操作,时间复杂度为O(1)。这题如果改成返回最大值,也是一个道理,维持一个最大栈,每次压入元素A,A比max栈顶元素大大大,就压入max栈。
3.5
1.操作系统为什么要引入虚拟地址?
深入探究:操作系统为什么要引入虚拟地址?
2.快速排序的复杂度说一说
3.说说中断
4.键盘按下字母‘a'到屏幕上显示字母'a'发生了什么?
键盘敲入 A 字母时,期间发生了什么....
3.8
1.数据库事务的基本要素
数据库事务具有4个特征,分别是原子性、一致性、隔离性和持久性,简称事务的ACID特性;
数据库事务具有4个特征,分别是原子性、一致性、隔离性和持久性,简称事务的ACID特性;
2.为什么要有中断
如果让内核定期对设备进行轮询,以便处理设备,那会做很多无用功,因为外设的处理速度一般慢于CPU,而CPU不能一直等待外部事件。所以能让设备在需要内核时主动通知内核,会是一个聪明的方式,这便是中断。
3.Linux中防止误删文件的做法
Linux系统下防止误删文件的操作
4.数据库中的join
数据库中表的几种JOIN方式
5.从 url 输入到返回请求的过程
从 url 输入到返回请求的过程是怎么样的
3.11
1.C++的右值
可以节省拷贝时间
什么时候用右值引用
2.宏加法
#define ADD(x,y) ((x)+(y)),为什么要括号呢?宏定义表达式写出加法
3.有个小问题,在自定义的结构体,如何使用new
自己记得写构造函数
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
3.24 OceanBase三面
1.把哪几条指令封装成一条机器指令,形成锁
那么怎么解决呢? 能不能让硬件做一种加锁的原子操作呢? 大名鼎鼎的“test and set”指令就是做这个事情的,该指令将读取内存、判断和设置值作为一个原子操作。单核环境下,锁的操作肯定是原子性了,多核呢?貌似还是不行,因为多个核心他们的锁操作是没有干扰的,都能够同时执行“test and set”,还是会出现两个线程同时获取到锁的情况, 所以硬件提供了锁内存总线的机制,在锁内存总线的状态下执行“test and set”操作就可以保证一个只有一个核执行成功,也就保证了不会存在多线程获取到锁的情况。
2.设计单例模式
C++中的单例模式
class CSingleton
{
private:CSingleton() //构造函数是私有的{}static CSingleton *m_pInstance;
public:static CSingleton * GetInstance(){if(m_pInstance == NULL) //判断是否第一次调用m_pInstance = new CSingleton();return m_pInstance;}
};
class CSingleton
{
private:CSingleton(){}static CSingleton *m_pInstance;class CGarbo //它的唯一工作就是在析构函数中删除CSingleton的实例{public:~CGarbo(){if(CSingleton::m_pInstance)delete CSingleton::m_pInstance;}};static CGarbo Garbo; //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数
public:static CSingleton * GetInstance(){if(m_pInstance == NULL) //判断是否第一次调用m_pInstance = new CSingleton();return m_pInstance;}
};
使用局部静态变量,非常强大的方法,完全实现了单例的特性,而且代码量更少,也不用担心单例销毁的问题。
class CSingleton
{
private:CSingleton() //构造函数是私有的{}
public:static CSingleton & GetInstance(){static CSingleton instance; //局部静态变量return instance;}
};
3.大端小端,英特尔CPU是什么端?
小端,也叫主机字节序。
主机字节序和网络字节序,大端小端
4.设计一个hashmap
C++ STL中哈希表 hash_map从头到尾详细介绍
5.Linux 可执行文件结构与进程结构
Linux 可执行文件结构与进程结构
可以看出,此可执行文件在存储时(没有调入到内存前)分为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分
3.29
基础要牢固
1.页面置换算法
2.进程调度算法和状态
3.单例设计模式
其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。C++中的单例模式
class Single
{
private:Single(){}static Single *sInstance;
public:static Single *getInstance()/*静态变量和静态函数都是分配在内存中的静态区里,第一次分配后函数退出了也不会销毁,在第二次或者n次调用这个函数时直接去静态区中拿来用,不用再分配一次内存,性能能得到不少的提升。*/{if(sInstance==NULL){sInstance=new Single();}return sInstance;}
};
4.最长公共子串
POJ1458 最长公共子序列长度
5.寻找前k小的数
寻找第K大
4.30
1.移动构造函数和移动赋值
使用右值引用传递对象,则代表调用者(有意或无意的)保证不会在之后继续使用该对象。移动构造函数接受右值引用,直接获取老数据。C++笔记 右值引用,移动语义,移动构造函数和移动赋值运算符 - 默然的文章 - 知乎 C++笔记 · 右值引用,移动语义,移动构造函数和移动赋值运算符 - 知乎
class Person {
private:int* data;public:Person() : data(new int[1000000]){}~Person() { delete [] data; }// 拷贝构造函数,需要拷贝动态资源Person(const Person& other) : data(new int[1000000]) {cout<<"hhh"<<endl;std::copy(other.data,other.data+1000000,data);}// 移动构造函数,无需拷贝动态资源Person(Person&& other) : data(other.data) {other.data=nullptr; // 源对象的指针应该置空,以免源对象析构时影响本对象}
};void func(Person p){// do_something
}
int main()
{Person p;func(p);func(Person()); // 调用Person的移动构造函数来创建实参return 0;
}
总结来说,移动构造和移动赋值(=操作符)就是把源对象的数据直接移动到新对象上,省去了拷贝操作
class Person
{
private:int age;string name;int* data;public:Person() : data(new int[1000000]){}~Person() { delete [] data; }// 拷贝构造函数Person(const Person& p) :age(p.age),name(p.name),data(new int[1000000]){std::copy(p.data, p.data+1000000, data);cout << "Copy Constructor" << endl;}// 拷贝赋值运算符Person& operator=(const Person& p){this->age = p.age;this->name = p.name;this->data = new int[1000000];std::copy(p.data, p.data+1000000, data);cout << "Copy Assign" << endl;return *this;}// 移动构造函数Person(Person &&p) :age(std::move(p.age)),name(std::move(p.name)),data(p.data){p.data=nullptr; // 源对象的指针应该置空,以免源对象析构时影响本对象cout << "Move Constructor" << endl;}// 移动赋值运算符Person& operator=(Person &&p){this->age = std::move(p.age);this->name = std::move(p.name);this->data = p.data;p.data=nullptr;cout << "Move Assign" << endl;return *this;}
};
int main()
{Person p1;Person p2 = p1; // 拷贝构造函数Person p3,p4;p3 = p4; // 拷贝赋值运算符Person p5;Person p6 = std::move(p5); // 移动构造函数Person p7,p8;p7 = std::move(p8); // 移动赋值运算符return 0;
}
2.Linux命令
Linux 命令大全
awk,功能很强大,主要是分隔字符,linux中的awk命令详解
设置指定分隔符的 要用引号
分割后再插入指定分隔符
awk单行脚本快速参考(三)选择性输出特定行 - 道客巴巴 (doc88.com)
输出指定行内容
输出最后一行以及正则匹配
sed,linux sed命令详解(推荐)_salmonwilliam的博客-CSDN博客
sort, linux sort 命令详解_salmonwilliam的博客-CSDN博客
top,Linux中top命令参数详解
du,linux命令du - 豆浆D - 博客园 (cnblogs.com)
df,linux命令详解之df命令_蝈蝈的博客-CSDN博客_df命令详解
df
命令作用是列出文件系统的整体磁盘空间使用情况。可以用来查看磁盘已被使用多少空间和还剩余多少空间。
查看端口号是否被占用
以3306为例,netstat -anp |grep 3306
查看所有端口情况
netstat -nultp
3.二叉树的非递归遍历
Leetcode 144. Binary Tree Preorder Traversal二叉树前序遍历
Leetcode 94. Binary Tree Inorder Traversal二叉树中序遍历
Leetcode 145. Binary Tree Postorder Traversal二叉树后序遍历
4.LFU的实现
LFU缓存结构设计_salmonwilliam的博客-CSDN博客_lfu实现
设计LRU缓存结构_salmonwilliam的博客-CSDN博客_设计lru缓存结构
5.一致性Hash原理与实现
一致性Hash原理与实现 - 简书 (jianshu.com)
5.11
1.递归反转单链表
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {
public:ListNode* ReverseList(ListNode* pHead) {if(pHead==NULL || pHead->next==NULL)return pHead;ListNode *nxt=pHead->next;ListNode *newHead=ReverseList(pHead->next);nxt->next=pHead;pHead->next=NULL;//pHead之前next指向nxt,现在要作废才行return newHead;/*ListNode *pre=NULL,*cur=pHead,*nxt=NULL;while(cur){nxt=cur->next;cur->next=pre;pre=cur;cur=nxt;}return pre;*/}
};
2.n个节点的二叉树有多少种形态
n个节点的二叉树有多少种形态_去远方-CSDN博客
int fun(int x)
{if(x==0 || x==1)return 1;int sum=0;for(int i=0;i<=x-1;i++){sum+=fun(i)*fun(x-1-i);}return sum;
}
5.12
今天收到京东的offer了,4.21是hr面
秋招目标
按照这个要求深入学习,2021年5月12日21:07:40
6.3腾讯
秋招
9.2腾讯光子一面
1.判断链表是够回文结构
判断一个链表是否为回文结构_牛客题霸_牛客网 (nowcoder.com)
/*** struct ListNode {* int val;* struct ListNode *next;* };*/class Solution {
public:/*** * @param head ListNode类 the head* @return bool布尔型*/ListNode* reverse(ListNode* head){ListNode* cur=head,*pre=NULL,*nxt=NULL;while(cur){nxt=cur->next;cur->next=pre;pre=cur;cur=nxt;}return pre;}bool isPail(ListNode* head) {// write code hereListNode* fast=head,*slow=head;while(fast && fast->next){slow=slow->next;fast=fast->next->next;}if(fast!=NULL)//链表长度为奇数的时候,比如1->2->3,fast=3,slow=2,slow应该slow=slow->next等于3,从3开始反转后半段链表{slow=slow->next;}ListNode* newhead=reverse(slow);while(newhead){if(newhead->val != head->val){return false;}newhead = newhead->next;head = head->next;}return true;}
};
2.智能指针原理及循环引用解决
智能指针shared_ptr循环引用问题及解决(weak_ptr)_猿来如此~的博客-CSDN博客
shared_ptr造成的循环引用&&解决方法和原理(弱引用&&强引用)_yc2zgh1314的博客-CSDN博客_shared_ptr循环引用
3. Innodb和MyISAM区别
4.重载以及编译器如何处理重载
C++的函数重载_??yy的博客-CSDN博客
最准确的映射机制为:作用域+返回类型+函数名+参数列表
5.SYN泛洪攻击原理及防御
A(攻击者)发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当这个服务器返回ACK以后,A不再进行确认,那这个连接就处在了一个挂起的状态,也就是半连接的意思,那么服务器收不到再确认的一个消息,还会重复发送ACK给A。这样一来就会更加浪费服务器的资源。A就对服务器发送非法大量的这种TCP连接,由于每一个都没法完成握手的机制,所以它就会消耗服务器的内存最后可能导致服务器死机,就无法正常工作了。更进一步说,如果这些半连接的握手请求是恶意程序发出,并且持续不断,那么就会导致服务端较长时间内丧失服务功能——这样就形成了DoS攻击。这种攻击方式就称为SYN泛洪攻击。
那么我们如何去防范这种SYN攻击呢?
其实最常用的一个手段就是优化主机系统设置。比如降低SYN timeout时间,使得主机尽快释放半连接的占用或者采用SYN cookie设置,如果短时间内收到了某个IP的重复SYN请求,我们就认为受到了攻击。我们合理的采用防火墙设置等外部网络也可以进行拦截。
9.6阿里意向书
9.10号美团金融一面
1. MySQL主键与索引的区别和联系
2.介绍实习工作中的推荐系统架构
推荐系统架构介绍
推荐系统全链路(1):召回粗排精排-各有所长
一开始我们可能有成千上万的item,首先要由召回(也叫触发,recall)来挖掘出原则上任何用户有可能感兴趣的东西。这个环节是入口。有时候,单独的召回可能难以做到照顾所有方面,这个时候就需要多路召回。很好懂,就是多个召回路共同决定进入粗排的候选。比如可以由一个召回专门根据用户过往的兴趣来筛选候选,那可以再加一个召回专门输出近一段时间的热门视频。他们的出发点都不一样,共同组成下一级的输入。粗排(pre-rank)一般接受几千个输入,这时候压力就大大降低了。粗排就可以放一些较为复杂的结构,比如mlp就可以放上去了。粗排的输出一般是小于1000的,那这个压力就更小了,精排(rank)就可以变得很复杂,什么transformer啊放进去也不过分。
MySQL分布式实现ID自增
MySQL分布式实现ID自增 (bbsmax.com)
mysql如何实现逻辑自增_mysql 的自增 id 的实现逻辑
9.26华为一面
1.死锁的条件
- 互斥,在一个时间,只能有一个进程使用资源
- 持有并等待,进程保持至少一个资源正在等待获取其他进程持有的额外资源
- 无抢占,一个资源只能被进程自愿释放
- 循环等待
2.数据库索引
不能给所有字段都建立索引,维护索引会有很大的成本
3.缓存击穿
- 加互斥锁。在并发的多个请求中,只有第一个请求线程能拿到锁并执行数据库查询操作,其他的线程拿不到锁就阻塞等着,等到第一个线程将数据写入缓存后,直接走缓存。
- 永不过期,加一个互斥锁保证数据单线程写
redis笔记_salmonwilliam的博客-CSDN博客
4.快排思路
时间复杂度nlogn,最坏情况n^2,空间复杂度考虑到递归的深度,就是logN,最坏就是N
5.指针和引用
指针是对象,引用是别名。
指针存放的是一个对象的地址,可以不赋初值,指针存的值可以改变。引用定义时必须赋值,引用将和它的初始值对象一直绑定在一起。
6.编程题
集合的所有子集_牛客题霸_牛客网 (nowcoder.com)
7.C++内存泄漏的情况
在类的构造函数和析构函数中没有匹配的调用new和delete函数
在释放对象数组时在delete中没有使用方括号
没有将基类的析构函数定义为虚函数。当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露
方法:即使new和delete自己计数,或者用valgrind工具
8.url 输入到返回请求的过程
阿里面试官问“说一下从 url 输入到返回请求的过程”的难度就是不一样! (qq.com)
10.29蚂蚁开奖
11.27蚂蚁三方寄回确认
C++春招实习和秋招面试过程记录相关推荐
- 论实习、暑期实习、秋招、春招之间的关系
自己的亲身体会,由于大三下学期不清楚暑期实习生的大厂招聘时间基本是2-5月份,5月末才反应过来,在此写篇文章给学弟学妹们参考. 所谓"实习"就是未毕业前的去企业上班,此时未签订劳动 ...
- 计算机视觉专硕:OCR、实习和秋招
向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程 公众号:datayx 智能票据录入系统 项目展示 真的是光阴似箭,好像昨天还沉浸在考研成功的喜悦,今天却要即将步入2 ...
- [经验]2020届后台开发方向实习,秋招经验总结
文章目录 [经验]2020届后台开发方向实习,秋招经验总结 实习 秋招 准备 1.算法题 2.简历 3.基础知识 4.招聘信息 5.智力题 6.心态 7.面经 [经验]2020届后台开发方向实习,秋招 ...
- 2021.6~2022.6实习、秋招总结
2021.6~2022.6实习.秋招总结 总结 实习 秋招 诺瓦星云(西安,FPGA开发) 新华三(成都,西安.数字ic设计) 浙江大华(杭州,FPGA开发) 海康微影传感(杭州,数字ic设计) 商汤 ...
- 互联网开发岗实习及秋招总结
互联网开发岗实习及秋招总结 文章目录 互联网开发岗实习及秋招总结 1 时间就是offer 1.1 实习 1.2 秋招 2 必先利其器 2.1 刷题!刷题!还是tmd刷题! 2.2 多投!多投!还是tm ...
- 暑期实习以及实习与秋招浅谈
实习前一天 从学校请了假到北京来已经过了三天,这三天把百度大厦逛了个遍,明天就要开始正式的实习了,作为双非本科并且是从java转到安卓,现在感觉压力很大,一种不自信,很丧的情绪围绕着心头,收到offe ...
- 腾讯2018春招实习生和秋招面试问题
2018.04.18 首先,我先说说整个过程吧.(如果对过程不感兴趣的话可以直接拉到下面的面试题) 笔试(我觉得考的稀烂,以为没有面试机会的)结束后大概一周,下来了面试通知,下午三点半. 我从我们大学 ...
- 关于实习和秋招的准备
作者:黄小斜 链接:https://www.zhihu.com/question/328924665/answer/800219819 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 之前在知 ...
- 潜水党回馈牛友,算法工程师2017年学习,实习,秋招总结
写在前面: 本人万年潜水党.在牛客网暗中观察了很长时间,也得到了很多有用的信息和帮助.一直计划最后写一篇文章回馈牛客.最近一段时间就是忙完了秋招忙论文.然后就是忙着玩.拖到现在终于赶在2018年到来之 ...
最新文章
- 655. Print Binary Tree 解题报告(树)
- 批处理中setlocal enabledelayedexpansion
- Windows下安装Cygwin配置Hadoop集群
- 371. 两整数之和
- amd linux 性能,10年内AMD处理器有多大改进?Linux下皓龙和霄龙每瓦性能对决
- Java演示手机发送短信验证码功能实现
- Spring - Spring Boot Spring Cloud
- 使用SpringData出现java.lang.AbstractMethodError
- STM32——串口通信
- 理论计算机图形渲染技术是否已经到了没有什么可以研究的地步了?
- 初中 计算机文化知识,计算机文化知识(Computer literacy).doc
- 内存中Android,什么是Android内存转储中的EGL和GL mtrack?
- springmvc源码解析MvcNamespaceHandler之mvc:default-servlet-handler/
- 『Delphi』File not found的解决办法
- python机器学习应用mooc_(1)KNN
- 图解设计模式 - Adapter 模式
- VNC 远程中标麒麟桌面版
- 快手第三季营收231亿:同比增13% 期内亏损27亿
- MATLAB 调用cplex解二次规划,【Cplex for MATLAB】安装问题以及二次规划的源码解释问题...
- 【ArchSummit】社交元宇宙的技术挑战与探索
热门文章
- 【解密】PDF文档忘记编辑密码 照样编辑
- Unity与讯飞的aiui交互
- 基于灰度投影法的图片偏移测量
- dcos master挂掉后 slave上面的container会咋样
- FCC算法和数据结构 项目实战:罗马数字转换器
- JS计算今天在本月第几周
- [win7 百度网盘] 登录安全验证显示空白页
- 市场调研-全球与中国LED多层指示灯市场现状及未来发展趋势
- ajax请求遇到的一些乱码问题及其解决
- yudian温控表a1温度怎么补偿_厦门宇电yudian温控表AI-516/516P型人工智能温度调节器控制器-恩莱自动化官网...