C++面试问题统计

1,makefile中$<,$@说明
$<第一个依赖的文件 $@目标文件
2,gcc 引用宏定义
-D
3,c++中find和find_first_of区别
find匹配整个字符串,find_first_of是搜索字符首次出现的位置
4,c++ replace_copy
replace是 替代 某一个元素, replace_copy是 复制并且替代 某一个元素
5,c++ list特性
list是一个线性双向链表,随机检索效率慢,可以迅速地在任何节点进行插入和删除操作
6,sort和stable_sort区别
sort:对给定区间所有元素进行排序,正常情况下,使用快排,但发现快排恶化,会自动调用其它排序方法辅助排序
stable_sort:对给定区间所有元素进行稳定排序
7,设计模式:观察者模式和访问者模式
观察者模式:定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生变化时,所依赖于它的对象都会得到通知并自动更新
访问者模式:表示作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的操作。
8,TCP、UDP区别,epoll和select区别
9,算法题:有一个数组,数组元素的1~n中的随机数,且不重复,找出元素对满足相加等于n+1,要求时间复杂度不超过o(n^2)
#include<iostream>
#include<map>
using namespace std;
int main(void)
{
int a[] = {1,3,5,7,9,2,10,4,8,6};

std::map<int, int> nodemap;

for (int i=0; i<10; i++)
{
std::map<int, int>::const_iterator it = nodemap.find(11-a[i]);
if (it == nodemap.end())
{
nodemap[a[i]] = i;
}
else
{
cout<<"pairs: "<<a[it->second]<<","<<a[i]<<endl;
}
}
}
10,socket编程
11,cmake使用
12,分布式框架
13,你让工人为你工作7天,给工人的回报是一根金条,金条平均分成相连的七段
你必须每天结束时都付费,如果只允许你两次把金条切断,你如何给你的工人付费
分成比例1:2:4的三段,因为两次弄断就是三段,第一天你给1,第二天你给2,找回你1,你自己就有1和4,第三天再给1,自己剩下4,第四天给4,然后叫他把1.2找给你,第五天给1,第六天给2叫他1找给你,第七天把最后1给他,
14,2,10,30,68规律
1^3+1, 2^3+2, 3^3+3, 4^3+4
15,要你去测试人的反应和光速哪个快,你会怎么做
16,单个TCP/IP端口上能监听多少个进程
一个进程启动一个TCP/IP端口去抓取进来的包,如果另外一个进程想利用这个端口将提示端口被占用
17,什么是interface?与class有什么区别
接口可以理解成一种特殊的类,由常量和抽象方法组成特殊类
接口不能被实例化
接口中的方法没有方法体{}
继承接口的类一定要实现接口中定义的方法
类可以实例化,可以定义自己的属性,字段和方法
类可以继承多个接口,但只能继承一个类
18,分布式解决方案中,多点(PC机)之间相互请求和接收信息,要保证各点之间
都能相互、实时通信,你会怎么做?
19,OOP和SOA,它们的目的分别是什么?
oop面向对象
soa面向服务架构
20,两个数组,求集合
#include<iostream>
#include<map>
using namespace std;

int main(void)
{
int a[] = {1,2,3,3,4, 9};
int b[] = {2,4,4,5,6,8, 1, 3};

std::map<int, int> ma, mb;
for (int i=0; i<sizeof(a)/sizeof(int); i++)
{
ma[a[i]] = 1;
}

for (int i=0; i<sizeof(b)/sizeof(int); i++)
{
mb[b[i]] = 1;
}

for (std::map<int, int>::iterator it = ma.begin(); it != ma.end(); it ++)
{
//cout<<it->first<<" "<<it->second<<endl;
if (it->second == mb[it->first])
cout<<it->first<<endl;
}
}
21,排序算法稳定性
保证排序前两个相等的数的位置与排序后位置相同。
稳定:冒泡排序,插入排序,归并排序,基数排序
不稳定:选择排序,快速排序,希尔排序,堆排序
22,map.clear清内存吗
clear清除了key-value键值和内容,如果涉及到堆上开辟内存的话,需要由程序员手动释放
23,判断平衡二叉树、链表逆序
bool IsBst(Node *root)
{
if (root== NULL)
return true;

if (!IsBst(root->left))
return false;

if (root->key <= last_key)
return false;

last_key = root->key;
if (!IsBst(root->right))
return false;

return true;
}

int main(void)
{
/*
4
2 5
1 3
* */
Node *root = CreateNode(4);
root->left = CreateNode(2);
root->right = CreateNode(5);
// root->left->left = CreateNode(1);
// root->left->right = CreateNode(3);

if (IsBst(root))
cout<<"is Bst"<<endl;
else
cout<<"is not Bst"<<endl;
}

g namespace std;

struct list
{
int key;
list *next;
};

list *make_list()
{
list *head = new list();
list *cur = head;
for (int i=0; i<5; i++)
{
cur->key = i;
if (i<4)
{
cur->next = new list();
cur = cur->next;
}
}
cur->next = NULL;
return head;
}

void show_list(list *head)
{
for (int i=0; i<5; i++)
{
cout<<head->key<<" ";
head = head->next;
}
cout<<endl;
}
list *listreverse(list *node)
{
list *pre, *post, *cur;

if (node == NULL || node->next == NULL)
return node;

pre = node;
cur = node->next;

while(cur)
{
post = cur->next;
cur->next = pre;
pre = cur;
cur = post;
}
node->next = NULL;
return pre;
}
int main(void)
{
list *head = make_list();
show_list(head);
head = listreverse(head);
show_list(head);
}

24,tcp握手挥手,为什么?
25,ip/数字求ip地址
26,timewait状态
27,mysql为什么使用b+树
28,redis什么时候会造成内存爆满
1,数据不停的增加,又不去除过期数据
2,使用dump内存数据时,redis会fork一个进程异步的执行,占用内存*2
3, 一般的设计方法如下: 1: 把表名转换为key前缀 如, tag: 2: 第2段放置用于区分区key的字段--对应mysql中的主键的列名,如userid 3: 第3段放置主键值,如2,3,4...., a , b ,c 4: 第4段,写要存储的列名
例如用户表 user, 转换为key-value存储:
userid
username
password
email
9
lisi
1111111
lisi@163.com
set user:userid:9:username lisiset user:userid:9:password 111111set user:userid:9:email lisi@163.com
29,什么时候用到初始化列表
1,如何类中有一个成员是引用,由于引用必须给予初始值
2,const属性必须给予初始值
3,对象成员没有默认构造函数
4, 如果类存在继承关系,派生类必须在其初始化列表中调用基类的构造函数
30,static_cast,dynmic_cast
1,static_cast,用于基本的数据类型及指针之间的转换
2,static_cast,类层次中基类与子类成员函数指针的转换(将子类函数指针转为基类函数指针)
3,static_cast,类层次中基类与子类指针或引用之间的转换
子类指针或引用转换为基类表示---安全
基类指针或引用转换为子类表示---不安全(没有动态类型检查)
4,dynamic_cast,继承关系的类指针对象或引用之间转换
5,dynamic_cast,包含有虚函数之间对象指针的转换
除了基类指针指向子类对象,可以没有虚函数外,其它要进行dynamic_cast转换必须要有虚函数才行
31,什么时候用到虚函数,纯虚函数
判断成员函数所在的类是否会作为基类,如果该函数在类被继承后有可能改变功能
考虑成员函数的调用是通过对象名还是基类通过基类指针或引用去访问,如果通过基类指针或引用去访问
有时候基类中将某一个成员函数声明为虚函数不是基类本身要用到,而是其派生类会用到,那么这个基类就是一个抽象类,没有实际意义不能被实例化,基类中留有一个接口,不实现,派生类中必须实现。
32,你做过最有成就感的事
1,站在全校师生面前唱歌,参加十佳歌星并取得名次,学生会期间成功举办多项晚会
2,大四找工作时,待遇最高,最快找到
3,一家公司中两年涨了四次工资,多次迭代开发奖金,外出解决项目问题奖金
4,为公司做出了两款从无到有的功能
33,你遇到的最大的问题,难点,怎么解决的
1,克服紧张,压力大,站着的全是自己的同学和老师,想着对着他们尴尬不好意思,然后自己就不断的提醒自己你是最棒的,天天对着镜子排练,找同学当听众,其实到了身临其境的时候根本就想不到那么多了,前面乌漆麻黑,也根本听不到下面的喧嚣声,也就想不了那么多了。
2,公司分配任务,是无人涉及的领域,文档只能从官网上找,不断的试验,将理论跑通,开始编码。
3,现场测试,人员复杂,成败在此一举,尤其是程序员去测试,那更是心里没谱,因为无论做了多少次测试,总会有意想不到的问题出现,这个时候没办法,只能听天由命。
34,mysql key建立规范
表的主键和外键必须有索引,数据量超过300的表应该有索引,经常与其他表进行连接的表,应该有索引,经常出现在where字句中的字段,应该有索引,索引应该建立在选择性高的字段上,索引应该建立在小字段上,尽量避免符合索引,频繁进行数据操作的,不要建立太多索引
35,mysql innodb和myisam区别
innodb支持事务,myisam强调性能,执行速度快,innodb支持外键,myisam使用表锁,innodb使用行锁,innodb不支持全文索引
36,两个队列实现栈,两个栈实现队列
入队列时,直接压入s1
出队列时,先判断s2是否为空,如果为空,将s1中的出栈,压入s2中,s2出栈

入栈时,直接入队列q1
出队列时,把q1中除了最后一个元素外全部导入q2中,然后把q1中的那个元素出队列,之后把q2中的元素导回q1
37, 给一个M*N的棋盘,问马能否从一个点走到另一个指定的点,如果可以给出一条路径
38,二叉树中最低公共节点

39,海量数据,求前100大的数
40,如何删除大文件
41,innodb原理
42,解决问题的方法
43,加班的看法
确实有工作无法完成,能力不足,必须要加班,努力减少与同事的差距
我现在没有任何家庭负担,可以全身心的投入工作,多学一点是一点,同时我必须提高自己工作效率,尽可能减少不必要的加班
44,个人未来的规划
尽管我的首要目标是做好自己岗位的事情,全力以赴,但我仍然想在3~5年内实现自己知识体系的构建,不断精进我的专业技能,作为行业里的一个出名的公司,公司的资源和发展都会对我的提升有很大的帮助,同时我会把我的专业技能回馈给公司。目前不会考虑走管理岗位,想做一个技术大牛。
45,给定一个有序数组的逆置(12345->45123),求最小值
46,哈弗曼树作用
在很多问题的处理过程中,需要进行大量的条件判断,这种判断结构的设计直接影响了程序运行的效率,我们把判定过程最优的二叉树称为哈夫曼树
哈夫曼树是带权路径长度最小的二叉树,一颗二叉树要使带权路径最小,必须使权值越大的叶子节点越靠近根节点,权值越小的叶子节点越远离根节点
47,内存是怎么管理的
内存分为4个区,分别是堆、栈、全局/静态存储区,常量存储区.
堆:new、malloc申请,需要由程序员手动释放
栈:函数执行过程中,函数内部的局部变量在栈上创建,函数执行结束后自动释放,空间有限
全局/静态存储区:全局变量和静态变量
常量存储区:常量不允许修改
48,统计一句话中单词出现的个数
1,从头到尾遍历这句话,把遍历到的单词放到hash_map中,并统计这个单词出现的个数
2,遍历hash_map,将遍历到的单词出现的次数放入优先级队列中
3,当优先级队列中的元素个数超过K个时,把元素优先级最低的那个元素取出,保持队列个数是K个
4,遍历完hash_map,则队列中就剩下出现次数最多的K个。
49,面向对象的加减乘除操作
50,动态规划算法
51,手写二叉排序树,判断二叉排序树
52,手写二分查找递归
53,两个线程同时访问一个全局变量
一个线程读,一个线程写,原子操作没问题,不是得话需要加锁
54,出错重传,怎么重传
TCP超时重传:在发送一个数据之后,就开启一个定时器,若这段时间内没有收到发送数据的ACK确认报文,则对该报文进行重传,在达到一定次数还没有成功时便放弃并发送一个复位信号
这里比较重要的是重传超时时间,怎样设置这个定时器的时间(RTO),从而保证对网络资源最小的浪费,如果RTO太小,可能有些报文只是遇到拥塞或者网络延时较大,太大的话,使得发送端需要等待长时间才会发现数据丢失,影响网络传输效率
TCP快速重传:如果发送端接收到3个以上的重复ACK时,就应该意识到,数据包丢失了,需要重新传递。这个机制不需要等到定时器溢出,所以叫快速重传
55,排序算法
56,在数组中找到第k大元素
57,vector、list、map、set等的区别,实现原理
vector动态数组,内存连续,插入效率低,随机访问快
list双向链表,内存不连续,快速插入删除,可在两端进行push,pop,不能随机访问
dequeue,双端队列,在功能上合并了list和vector,随机访问方便,插入删除方便,可在两端进行push、pop
map,由一个键值和一个映照数据组成,具有一一对应的关系,采用红黑树实现,插入键值的元素不允许重复,比较函数只对元素的键值进行比较,元素的各项数据可通过键值检索出来。
set,是一种key结构,set能存储同一数据类型的数据结构,经过set的数据会自动排序,采用红黑树实现。
58,线程安全的单例模式、代理、工厂模式
59,生产者消费者模型及实现
60,硬链接和软连接的区别
从使用的角度,两者没有区别
硬链接源文件/连接文件公用一个inode号,说明他们是同一个文件,(链接文件就是 一个指针,指向源文件),而软连接拥有不同的inode号,表明他们不是同一个文件
链接数目上,软连接的链接个数不会增加
文件大小不一样
软连接没有文件系统的限制
61,内存泄露如何检测,如何解决
valgrind内存检测工具,养成编程的好习惯,保证每个malloc/new对应一个free/delete
62,团队中遇到意见不同意的情况如何解决
最重要的就是学会沟通,学会聆听别人的看法,倾听别人的意见,了解出别人的意见有什么优势,会产生哪些问题。其次,表达出自己的想法,让对方明白你的思路。避免将自己的观点强加给别人,又不愿意听取别人意见,控制自己的情绪,避免争吵。如果意见不统一的话,找第三者提供建议,上级提供建议。
63,推销一下自己,说几个自己最出彩的点
64,友元函数的作用
在一个类中,用friend声明的非本类函数就是友元函数
友元函数的作用是:可以直接访问本类的私有成员,提高编程的灵活性和执行效率
65,背包算法
66,f(n)=f(n-1)+f(n-2)+f(n-3) n>=3
67,A*算法
68,二叉树的最大子树和
69,RST在TCP协议中的作用
用于复位某种原因引起的错误连接,也用来拒绝非法数据和请求。如果收到了RST位的时候,通常发生了某些错误
70,死锁条件,如何解决
指的是多个进程因竞争共享资源而造成的一种僵局,若无外力作用,将一直阻塞
竞争系统资源、进程的推进顺序不当
71,c语言怎么用void *
72,C++多态怎么实现的(虚函数、模板)
73,分配器原理
74,滑动窗口协议
75,http协议是不是有状态,客户端向服务端
发起连接,服务器怎么知道客户端之前有连接过,
如何辨识客户端
76,linux删除属性6天前的文件
find /dir -mtime +6 -name "filename" -exec rm -rf {} \
77,数据库索引的类型,索引的实现方式
普通索引、唯一索引、主键索引、组合索引、聚合索引
78,红黑树、b树、b+树原理区别
79,求一篇文章中某个字符串出现的次数
80,sort用什么排序
81,下载速度很慢,试着从网络协议的角度分析原因
82,出现hash冲突怎么办
链地址法,建立一个公共溢出区
83,有一个数组,前半部分递增,后半部分递减,求最大值
84,STL迭代器失效,怎么解决
vector:插入删除迭代器都会失效
deque:两端插入不会对已有元素进行移动,不会引起迭代器失效,中间插入会引起迭代器失效
删除两端元素时,不需要移动元素,故只会使被删除元素的迭代器失效,删除中间元素时,会使两端元素向被删除元素位置移动,所有迭代器均失效
list:插入不会造成迭代器失效,删除只会引起被删除节点的迭代器失效
set、map:插入操作会申请新的节点空间,不会引起迭代器失效,删除操作只会引起被删除节点的迭代器失效
85,STL线程安全,怎么解决
stl不是线程安全的,需要程序员手动加锁,互斥锁或者读写锁
86,有个正数和负数递增的数组,求绝对值最大的数
87,数组中连续子序列的最大乘积
88,网络编程的异步传输是什么
89,参数什么时候用引用什么时候用指针
传递指针与传递引用唯一的优势是避免拷贝,提高程序运行效率
如果数据对象很小,如内置数据类型或者小型结构,按照值传递的方式
如果数据对象是数组,使用指针
如果数据对象是较大的结构,使用引用或const指针
如果数据对象是类对象,则只用引用
90,合并二叉搜索树
91,自增运算符步骤
92,在一个数组中有一个数据只出现一次外,其他数字成对出现
93,c++初始化列表执行顺序
构造函数的两个阶段初始化阶段和计算阶段,
按照成员变量的顺序进行初始化,而不是按照初始化表的顺序
94,向量点乘和叉乘用法
95,二维空间内,点到直线距离
96,同步和异步的用法,怎么实现
97,你对公司负面新闻的看法
98,如何减压
99,三年规划
100,意见不统一,怎么办
101,获取知识的途径
102,加班的看法
103,1~100,有一个缺了怎么办,缺两个呢?
104,2000人,已知id和分数,排序分数
105,图找最短路径
106,怎么在网络中广播一个文件,传输一个大文件要考虑什么
107,怎么判断两台主机之间的网络状态好不好
108,给斐波那契数列建索引
109,引用和多态的关系
110, c++的map和unodermap有什么区别
111,4个城市, 两两之间相通, 且A到B 与 B到A的权重值不同. 写出算法实现, 一条路径 能访问到4个城市各1次, 且消耗最小.
112,深度优先遍历时间复杂度是多少
113,C++虚函数多态、结构体、python、多源最短路径
反转链表、SQL多表查询,机器学习,空格替换
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值