Java最新C++标准模板库STL【最全总结】【收藏方便使用(1),java算法面试代写

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

蚂蚁金服5面,总结了49个面试题,遇到的面试官都是P7级别以上

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取


operator± 直接使用+将两个字符串直接拼接起来

compare operator 直接使用 == ,!=,<,<=,>,>=比较大小,比较规则是字典序

length()/size() length()返回字符串的长度,即存放的字符数,时间复杂度是O(1)。size()与length()基本相同

insert(pos,string) 在 pos 号位置插入字符串 string,时间复杂度为O(N)

insert(it,it2,it3) it2和it3为待插入字符串的首尾迭代器,用来表示串[it2,it3)将被插在it的位置上

erase(it) 删除迭代器为it的元素,时间复杂度为O(N)

erase(first,last) 删除一个区间内的所有元素,时间复杂度为O(N)

erase(pos,length) 其中pos为需要开始删除的起始位置,length为删除的字符个数

clear() 用于清空string中的数据,时间复杂度为O(1)

substr(pos,len) 返回从pos号位开始,长度为len的子串,时间复杂度为O(len)

string::npos 是一个常数,其本身的值为-1,但由于是unsigned_int类型,因此实际上也可以认为是unsigned_int类型的最大值。string::npos 用以作为find函数失配时的返回值,所以可以认为string::npos可以等于-1或者4294967295

str.find(str2) 当str2是str的子串时,返回其在str中第一次出现的位置,如果str2不是str的子串,那么返回string::npos

str.find(str2,pos) 从str的pos号位开始匹配str2,返回值与上相同,时间复杂度为O(nm),其中n和m分别为str和str2的长度。

str.replace(pos,len,str2) 把str从pos号位开始,长度为len的子串替换为str2

str.replace(it1,it2,str2) 把str的迭代器[it1,it2]范围的子串替换为str2 时间复杂度为O(str.length())

map

======================================================================

  • map翻译为映射,也是常用的STL容器。在定义数组时,如a[2] = 3其实是定义了一个从int到int的映射,b[2]=3.5定义了int到double的映射,无论是什么类型,总是将int类型映射到了其他类型。当需要以其他类型作为关键字来做映射时,会显得不方便。我们可以利用map实现将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器)。

定义


引入

#include

单独定义一个map

map<type1,type2> mp;

如果是字符串到整型的映射,必须使用string而不能使用char数组

map<string,int> map;

将一个set容器映射到一个字符串

map<set,string>

访问方式


  • 通过下标访问

对于一个定义为map<char,int> mp的map来说,就可以直接使用mp[‘c’]的方式来访问它对应的整数。

  • 通过迭代器访问,map可以使用it->first来访问键,使用it->second来访问值

map<char,int> mp;

mp[‘m’] = 20;

mp[‘r’] = 30;

mp[‘a’] = 40;

for(map<char,int>::iterator it = mp.begin();it!=mp.end();it++){

printf(“%c %d”,it->first,it->second);

}

常用函数


find(key) 返回键为key的映射的迭代器,时间复杂度为O(log N),N为map中的映射的个数

map<char,int> mp;

mp[‘m’] = 20;

mp[‘r’] = 30;

mp[‘a’] = 40;

map<char,int>::iterator it = mp.find(‘r’);

printf(“%c %d\n”,it->first,it->second);

erase(it) 删除单个迭代器,可以配合find函数使用

map<char,int> mp;

mp[‘m’] = 20;

mp[‘r’] = 30;

mp[‘a’] = 40;

map<char,int>::iterator it = mp.find(‘b’);

mp.erase(it);

erase(key) key为欲删除的键,时间复杂度为O(logN)

erase(first,last) 删除一个区间内的所有元素

map<char,int> mp;

mp[‘m’] = 20;

mp[‘r’] = 30;

mp[‘a’] = 40;

map<char,int>::iterator it = mp.find(‘m’);

mp.erase(it,mp.end());

size() 用来获得map中映射的对数,时间复杂度为O(1)

clear() 用来清空map中所有的元素,时间复杂度为O(N),N为元素个数

常见用途


  • 需要建立字符与整数之间映射的题目,使用map可以减少代码量

  • 判断大整数或者其他类型是否存在的题目,可以把map当bool数组用

  • 字符串和字符串的映射也有可能会用到

  • 注意,map的键和值是唯一的,而如果一个键需要对应多个值,就只能用multimap

queue

========================================================================

  • queue翻译成队列,先进先出的容器,尾进头出

定义


引入

#include

queue定义的写法和其他STL容器相同

queue name;

访问方式


由于队列本身是一种先进先出的限制性数据结构,因此在STL中只能通过front()来访问队首元素,或者通过back()来访问队尾元素

queue q;

for(int i = 1;i<=5;i++){

q.push(i);

}

printf(“%d %d\n”,q.front(),q.back());

常用函数


push(x) 将x进行入队,时间复杂度为O(1)

front(),back() 获得队首和队尾元素

pop() 令队首元素出队,时间复杂度为O(1)

empty() 检测queue是否为空,返回true则空,返回false则非空

size() 返回queue内元素的个数,时间复杂度为O(1)

常见用途


  • 当需要实现bfs时,可以不用自己动手实现一个队列,而是用STL中的queue作为代替,以提高程序的准确性

  • 有一点需要注意,使用front()和pop()函数前,必须用empty()判断队列是否为空,否则有可能因为队列空而出现错误。

priority_queue

==================================================================================

  • priority_queue又称为优先队列,其底层是用堆来实现的,在优先队列中,队首元素一定是当前队列中优先级最高的那一个。例如在如下的队列中有以下元素,且定义好了优先级

桃子(优先级3)

梨子(优先级4)

苹果(优先级1)

那么出队的顺序为梨子(4)->桃子(3)->苹果(1)

当然,可以在任何时候往优先队列里面push元素,而优先队列底层的数据结构heap会随时调整结构,使得每次的队首元素都是优先级最大的。

定义


引入

#include

定义

priority_queue name;

访问方式


和队列不一样的是,优先队列没有front()函数与back()函数,而只能通过top()函数来访问队首元素(也可以称为堆顶元素),也就是优先级最高的元素

priority_queue q;

q.push(3);

q.push(4);

q.push(1);

printf(“%d\n”,q.top());

常用函数


push(x) 将x入队,时间复杂度为O(logN),其中N为当前优先队列中的元素个数

top() 令队首元素出队,时间复杂度为O(logN),其中N为当前优先队列中的元素个数

empty() 检测优先队列是否为空,返回true则空,返回false则非空,时间复杂度为O(1)

size() 返回优先队列内的元素的个数,时间复杂度为O(1)

元素优先级如何设置

基本数据类型

对于int,double,char型等可以直接使用的数据类型,

优先队列对他们的优先级设置一般是数字越大的优先级别越高,

char的话就是字典序越大的优先级越高。

自定义优先级

priority_queue<int,vector,less > q 数字越大的优先级越高,与默认效果一样

priority_queue<int,vector,greater > q 数字越小的优先级越高

结构体优先级的设置

优先队列的这个函数与sort中的cmp函数的效果是相反的

常见用途


  • 优先队列可以解决一些贪心问题,也可以对迪杰斯特拉算法进行优化,因为优先队列的本质是堆

  • 在使用top函数时,必须用empty函数判断优先队列是否为空,否则可能会因为队空而出现错误

stack

========================================================================

  • stack是栈,是一个后进先出的容器

定义


引入

#include

定义

stack< type > name;

访问方式


stack只能通过top()来访问栈顶元素

常用函数


push(x) 将x入栈,时间复杂度为O(1)

top() 获得栈顶元素,时间复杂度为O(1)

pop() 用来弹出栈顶元素,时间复杂度为O(1)

empty() 用来检测stack内是否为空,返回 true 为空, false 为非空,时间复杂度为O(1)

size() 返回stack 内元素的个数,时间复杂度为O(1)

常见用途


  • stack用来模拟实现一些递归,防止程序对栈内存的限制而导致程序运行错误。一般来说,程序的栈内存空间很小,对于有些题目来说,如果用普通的函数来执行递归,一旦递归层数过深,则会导致程序运行崩溃,如果用栈来模拟递归算法的实现,则可以避免这一方面的问题。

pair

=======================================================================

  • pair是一个很实用的“小玩意”,当想要将两个元素绑在一起作为一个合成元素、又不想要因此定义结构体时,使用pair可以很方便的作为一个代替品。也就是说,pair实际上可以看作一个内部有两个元素的结构体,而且这两个元素的类型是可以指定的。

struct pair{

type1 first;

type2 second;

};

定义


引入

#include

#include //map中包含utility

定义

pair <int,string> p;

//定义时初始化

pair <string,int> p(“test”,5);

//临时构建

pair <string,int>(“test”,5)

//使用自带的make_pair函数

make_pair(“test”,5)

访问方式


使用first second的方式访问

pair<string,int> p;

p.first = “Test”

p.second = 5;

常用函数


**比较操作数 **== != < > <= >= 比较的规则是先以first的大小作为标准,只有当first相等时才用second比较

常见用途


  • 用来代替二元结构体以及其构造函数,可以节省编码的时间。

  • 作为map的键值对来进行插入,如下

map <string,int> mp;

mp.insert(make_pair(“test”,5));

mp.insert(pair<string,int>(“test”,5));

algorithm头文件下的常用函数

=====================================================================================

max(x,y),min(x,y)和abs(x),fabs(x) max和min用来返回x,y中最大值和最小值,如果要比较三个数x,y,z,max(x,max(y,z)),abs(x)和math(x)下的fabs分别返回整形x和浮点型x的绝对值

swap(x,y) 交换x和y的值

reverse(it,it2) 将数组指针在[it,it2)之间的元素或容器的迭代器在这个范围内的元素进行反转

next_permutation() 给出一个序列在全排列中的下一个序列

fill() 可以把数组或容器中的某一段区间赋为某个相同的值。和memset不同,这里的赋值可以是数组类型对应范围中的任意值

int a[5] = {1,2,3,4,5};

fill(a,a+5,233); //将a[0]~a[4]均赋值为233

输出数组为

233 233 233 233 233

sort(首元素地址,尾元素的下一个地址,比较函数)

实现自定义比较函数cmp

最后

在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例

MyBatis答案解析
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

大家看完有什么不懂的可以在下方留言讨论也可以关注。

觉得文章对你有帮助的话记得关注我点个赞支持一下!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

的迭代器在这个范围内的元素进行反转

next_permutation() 给出一个序列在全排列中的下一个序列

fill() 可以把数组或容器中的某一段区间赋为某个相同的值。和memset不同,这里的赋值可以是数组类型对应范围中的任意值

int a[5] = {1,2,3,4,5};

fill(a,a+5,233); //将a[0]~a[4]均赋值为233

输出数组为

233 233 233 233 233

sort(首元素地址,尾元素的下一个地址,比较函数)

实现自定义比较函数cmp

最后

在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例
[外链图片转存中…(img-LsCfZbr7-1715366499299)]

[外链图片转存中…(img-TvZDFKKb-1715366499300)]
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

大家看完有什么不懂的可以在下方留言讨论也可以关注。

觉得文章对你有帮助的话记得关注我点个赞支持一下!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值