秋招已过,各大厂的面试题分享一波 附C++实现
数据结构和算法是面试的一座大山,尤其去面试大厂更是必不可少!简单说明一下为啥喜欢考数据结构和算法,首先,算法有用也没用,如果是中小型企业的简单业务逻辑,可能用不到啥算法,但大厂一定会用到,都知道数据库底层会用到红黑树、B++树等,去oracle公司,那数据结构一定要玩转,再加入想去阿里,百万数据量,不会算法去优化,可能阿里早倒闭,但小长数据量会比较少,用算法就没什么必要了。
一、桶排序应用-求最大差值
1、题目
给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用基于比较的排序。
2、思路分析
桶排序应该都知道吧,跟计数排序和基数排序都是非比较排序,像快排、归并都是比较排序。其实,桶排序是一种思想,具体实现是计数排序和基数排序。
接下来直接来分析题目,如下:
如果有N个数,准备N+1个桶,
遍历找到最小值和最大值
假如,有9个数,准备10个桶,中间必定存在最少一个空桶,说明最大差值一定不在一个桶内,但不一定在空桶两边。
举例子如下:
三个数,四个桶,最大差值19
19 空桶 30 49
3、代码实现
如下:
#include<iostream>
#include<vector>
#include<climits>
using namespace std; class Solution{
public:
int maxGap(vector<int> &nums){
if(nums.size() < )
return ; int len = nums.size();
int min_index = INT_MAX;
int max_index = INT_MIN; //找出数组的最大值和最小值
for(int i=;i<nums.size();i++){
min_index = min(min_index,nums[i]);
max_index = max(max_index,nums[i]);
}
if(min_index == max_index)
return ; bool *hasNum = new bool[len+]; //每个桶是否被访问过
int *maxs = new int[len+]; //最大值数组
int *mins = new int[len+]; //最小值数组 int bid = ;
for(int i = ;i<len;i++){
bid = bucket(nums[i],len,min_index,max_index); //形成桶
mins[bid] = hasNum[bid] ? min(mins[bid],nums[i]) : nums[i]; //给最大值桶赋值
maxs[bid] = hasNum[bid] ? max(maxs[bid],nums[i]) : nums[i] ; //给最小值桶赋值
hasNum[bid] = true;
} int res = ;
int lastMax = maxs[];
for(int i=;i<len;i++){
if(hasNum[i]){
res = max(res,mins[i]-lastMax);
lastMax = maxs[i];
}
} return res;
}
private:
int bucket(int num,int len,int min1,int max1){
return (int) ((num-min1)*len/(max1-min1));
}
}; int main()
{
int temp[] = {,,,,};
vector<int> nums(temp,temp+);
cout << "max:" << Solution().maxGap(nums) << endl; return ;
}
二、用数据实现固定大小的队列和栈
1、题目
用数据实现固定大小的队列和栈
2、思路分析
队列和和栈的特性分别是:先进先出和先进后出,思路分析见下图:
图上,标注的很明白了,有不明白的欢迎留言
3、代码实现
首先是数组实现栈,代码如下:
#include<iostream>
#include<vector>
using namespace std; class ArrayStack{
private:
int index; //插入位置的下标
int *arr;
int maxSize; public:
ArrayStack(int initSize){
if(initSize < )
throw "The initSize is less than 0";
arr = new int[initSize];
index = ;
maxSize = initSize;
} void push(int num){ //压入栈
if(index == maxSize)
throw "The stack is full";
arr[index++] = num;
}
int pop(){
if(index == )
throw "The stack is empty";
return arr[--index];
}
}; int main()
{
ArrayStack stack1 = ArrayStack();
stack1.push();
stack1.push();
stack1.push();
cout << "num:" << stack1.pop() << endl; return ;
}
用数组实现队列,代码如下:
#include<iostream>
#include<vector>
using namespace std; class ArrayQueue{
private:
int *arr;
int size;
int start; //弹出下标
int end; //插入下标
int maxSize; //数组最大值
public:
ArrayQueue(int initSize)
{
if(initSize < )
throw "The initSize is less than 0"; arr = new int[initSize];
size = ;
start = ;
end = ;
maxSize = initSize;
} void push(int num){
if(size == maxSize)
throw "the queue is full";
size++;
arr[end] = num;
end = end==maxSize-?:end+; //让end可以在数组中循环跑
}
int pop(){
if( == size)
throw "the queue is empty";
size--;
int tmp = start;
start = start==maxSize-?:start+; //跟end一样在数组中循环跑
return arr[tmp];
} }; int main()
{
ArrayQueue arrQueue = ArrayQueue();
arrQueue.push();
arrQueue.push();
cout << "num:" << arrQueue.pop() << endl; return ;
}
三、实现特殊的栈 O(1)返回最小元素
1、题目
实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小元素的操作。
【要求】
- pop、push和getMin操作的时间复杂度都是O(1)
- 设计的栈类型可以使用现成的栈结构
2、思路
直接上图,如下:
3、代码实现
代码如下:
#include<iostream>
#include<vector>
#include<stack>
using namespace std; class GetMinStack{
private:
stack<int> stackData;
stack<int> stackMin;
public:
void push(int num){
if(stackMin.empty()){
stackMin.push(num);
}else if(num <= getmin()){
stackMin.push(num);
}
stackData.push(num); } int pop(){
if(stackData.empty())
throw "the empty";
int value = stackData.top();
stackData.pop();
if(value == getmin()){
stackMin.pop();
}
return value; } int getMin(){ //获取最小值
if(stackMin.empty())
throw "the stackMin is empty";
return stackMin.top();
} int getmin(){
if(stackMin.empty())
throw "the stack is empty";
return stackMin.top();
} }; int main()
{
GetMinStack minStack = GetMinStack();
minStack.push();
minStack.push();
minStack.push();
cout << "pop num:" << minStack.pop() << endl;
cout << "min num:" << minStack.getMin() << endl; return ;
}
会继续分享面经和算法,希望持续关注!
秋招已过,各大厂的面试题分享一波 附C++实现的更多相关文章
- 二本非科班,秋招,实习,面试,offer之路
不知不觉已经工作一年多的,我是2019年7月毕业的,但是如果算上实习就工作差不多两年了的吧. 最近不是刚刚过了圣诞节吗?然后又准备到元旦了,迎来2021年!在微信公众号上看到小部分公众号在总结2020 ...
- 【Java】几道常见的秋招面试题
前言 只有光头才能变强 Redis目前还在看,今天来分享一下我在秋招看过(遇到)的一些面试题(相对比较常见的) 0.final关键字 简要说一下final关键字,final可以用来修饰什么? 这题我是 ...
- 算法转 Java 后端,2021秋招斩获腾讯、京东、百度等大厂 offer 面经分享!|JavaGuide|Guide哥
这是一篇来自算法转Java后端的一位读者的投稿!文章主要分享了作者从迷茫崩溃到最终斩获腾讯.京东.百度等大厂 offer 的经历.文章内容很全面.真实,相信可以对正在准备面试的小伙伴有帮助! 看到公众 ...
- 秋招如何抱佛脚?2022最新大厂Java面试真题合集(附答案
2022秋招眼看着就要来了,但是离谱的是,很多同学最近才想起来还有秋招这回事,所以纷纷临时抱佛脚,问我有没有什么快速磨枪的方法, 我的回答是:有! 说起来,临阵磨枪没有比背八股文更靠谱的了,很多人对这 ...
- 我的秋招经验分享(已拿BAT头条网易滴滴)
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- 程序员小哥教你秋招拿大厂offer
快要到秋招了,对于应届生来说,秋招是一个特别重要的机会.对于社招同学来说,金九银十也是一个很好的跳槽窗口. 而我呢,因为是从上海到广州工作,就没有提前先把工作定下来.刚好也趁这个机会出去旅游了两个月. ...
- 拿到BAT等大厂offer以后,我发现了关于秋招的一些真相
关于秋招的一些真相 微信公众号[程序员江湖] 作者陆小凤,985 软件硕士,阿里 Java 研发工程师,在技术校园招聘.自学编程.计算机考研等方面有丰富经验和独到见解,目前致力于分享程序员干货和学 ...
- 直面秋招!非科班生背水一战,最终拿下阿里等大厂offer!
前言 2020年已经接近到9月份了,很多粉丝朋友都对金九银十雀雀欲试了吧!也有很多朋友向我求教经验,因为我自己工作相对于稳定,在这里给大家分享一个粉丝朋友的经历,他作为一个曾经的菜鸡面试者,在不断的失 ...
- 我的Java秋招面经大合集
阿里面经 阿里中间件研发面经 蚂蚁金服研发面经 岗位是研发工程师,直接找蚂蚁金服的大佬进行内推. 我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer. 然后我也参加了 ...
随机推荐
- java没有firendly访问类型
java中只有public.private.protected.default这几种修饰符,没有friendly修饰符,没加修饰符就是friendly.friendly只是一种说法,把它认为是defa ...
- compare.go
package clientv3 import ( pb "github.com/coreos/etcd/etcdserver/etcdserverpb" ) type C ...
- 数据保存策略(Retention Policies)
数据保存策略(Retention Policies) InfluxDB没有提供直接删除Points的方法,但是它提供了Retention Policies.主要用于指定数据的保留时间:当数据超过了指定 ...
- BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案
BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案 Description 小 Z 是 ZRP(Zombies’ Republic of Poetry,僵尸诗歌共和国)的一名诗歌爱好者, ...
- BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流
BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞 ...
- Django中Middleware中间件
Django中Middleware中间件 1 Middleware中间件概述 django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中间件相应的方法.实际上当 ...
- hystrix 请求合并(6)
hystrix支持N个请求自动合并为一个请求,这个功能在有网络交互的场景下尤其有用,比如每个请求都要网络访问远程资源,如果把请求合并为一个,将使多次网络交互变成一次,极大节省开销.重要一点,两个请求能 ...
- redis的Sorted Set类型!!!!
一.概述: Sorted Set(有序集合)和Set类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted Set中的每一个成员都会有一个分数(sc ...
- SpringBoot自动配置原理
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面Spring的文章(以学习的顺序排好): S ...
- 入门系列之Scikit-learn在Python中构建机器学习分类器
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由信姜缘 发表于云+社区专栏 介绍 机器学习是计算机科学.人工智能和统计学的研究领域.机器学习的重点是训练算法以学习模式并根据数据进行预 ...