秋招已过,各大厂的面试题分享一波 附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. 然后我也参加了 ...
随机推荐
- 删除外部dwg中指定的块定义
本例实现删除外部图纸中指定的块定义,在外部图纸当前模型空间中是没有该块定义的块参照存在. 代码如下: void CBlockUtil::DeleteBlockDefFormOtherDwg(const ...
- 【bzoj 4173】数学
Description Input 输入文件的第一行输入两个正整数 . Output 如题 Sample Input 5 6 Sample Output 240 HINT N,M<=10^15 ...
- nginx+php安装
1.环境概述 虚拟机系统:CentOS Linux release 7.3.1611 (Core) 宿主机系统:Mac Sierra version 10.12.3 nginx:1.10.3 php: ...
- 【数学基础篇】---详解极限与微分学与Jensen 不等式
一.前述 数学基础知识对机器学习还有深度学习的知识点理解尤为重要,本节主要讲解极限等相关知识. 二.极限 1.例子 当 x 趋于 0 的时候,sin(x) 与 tan(x) 都趋于 0. 但是哪一个趋 ...
- 将本地文件传输到GitHub
统一概念: 工作区:增删文件和内容 暂存区:键入命令 git add 改动的文件,此次改动就放到了 『暂存区』 本地仓库 :键入命令 git commit ,此次改动就放到了『本地仓库』,每个 com ...
- vue中的 ref 和 $refs
如图,ref 被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象上.如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素:如果用在子组件上,引用就指向组件实例: ...
- 多线程学习系列二(使用System.Threading)
一.什么是System.Threading.Thread?如何使用System.Threading.Thread进行异步操作 System.Threading.Thread:操作系统实现线程并提供各种 ...
- java并发编程(2) --Synchronized与Volatile区别
Synchronized 在多线程并发中synchronized一直是元老级别的角色.利用synchronized来实现同步具体有一下三种表现形式: 对于普通的同步方法,锁是当前实例对象. 对于静态同 ...
- Quartz.Net学习笔记
一.概述 Quartz.NET是一个强大.开源.轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp.net应用中.它灵 ...
- 兼容性:Adapter(适配器模式)【PHP】
Adapter(适配器模式) ---- 加个“适配器”以便于复用 将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景 如果 ...