数据结构和算法是面试的一座大山,尤其去面试大厂更是必不可少!简单说明一下为啥喜欢考数据结构和算法,首先,算法有用也没用,如果是中小型企业的简单业务逻辑,可能用不到啥算法,但大厂一定会用到,都知道数据库底层会用到红黑树、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、题目

  实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小元素的操作。

  【要求】

  1. pop、push和getMin操作的时间复杂度都是O(1)
  2. 设计的栈类型可以使用现成的栈结构

  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++实现的更多相关文章

  1. 二本非科班,秋招,实习,面试,offer之路

    不知不觉已经工作一年多的,我是2019年7月毕业的,但是如果算上实习就工作差不多两年了的吧. 最近不是刚刚过了圣诞节吗?然后又准备到元旦了,迎来2021年!在微信公众号上看到小部分公众号在总结2020 ...

  2. 【Java】几道常见的秋招面试题

    前言 只有光头才能变强 Redis目前还在看,今天来分享一下我在秋招看过(遇到)的一些面试题(相对比较常见的) 0.final关键字 简要说一下final关键字,final可以用来修饰什么? 这题我是 ...

  3. 算法转 Java 后端,2021秋招斩获腾讯、京东、百度等大厂 offer 面经分享!|JavaGuide|Guide哥

    这是一篇来自算法转Java后端的一位读者的投稿!文章主要分享了作者从迷茫崩溃到最终斩获腾讯.京东.百度等大厂 offer 的经历.文章内容很全面.真实,相信可以对正在准备面试的小伙伴有帮助! 看到公众 ...

  4. 秋招如何抱佛脚?2022最新大厂Java面试真题合集(附答案

    2022秋招眼看着就要来了,但是离谱的是,很多同学最近才想起来还有秋招这回事,所以纷纷临时抱佛脚,问我有没有什么快速磨枪的方法, 我的回答是:有! 说起来,临阵磨枪没有比背八股文更靠谱的了,很多人对这 ...

  5. 我的秋招经验分享(已拿BAT头条网易滴滴)

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  6. 程序员小哥教你秋招拿大厂offer

    快要到秋招了,对于应届生来说,秋招是一个特别重要的机会.对于社招同学来说,金九银十也是一个很好的跳槽窗口. 而我呢,因为是从上海到广州工作,就没有提前先把工作定下来.刚好也趁这个机会出去旅游了两个月. ...

  7. 拿到BAT等大厂offer以后,我发现了关于秋招的一些真相

    关于秋招的一些真相 ​ 微信公众号[程序员江湖] 作者陆小凤,985 软件硕士,阿里 Java 研发工程师,在技术校园招聘.自学编程.计算机考研等方面有丰富经验和独到见解,目前致力于分享程序员干货和学 ...

  8. 直面秋招!非科班生背水一战,最终拿下阿里等大厂offer!

    前言 2020年已经接近到9月份了,很多粉丝朋友都对金九银十雀雀欲试了吧!也有很多朋友向我求教经验,因为我自己工作相对于稳定,在这里给大家分享一个粉丝朋友的经历,他作为一个曾经的菜鸡面试者,在不断的失 ...

  9. 我的Java秋招面经大合集

    阿里面经   阿里中间件研发面经 蚂蚁金服研发面经 岗位是研发工程师,直接找蚂蚁金服的大佬进行内推. 我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer. 然后我也参加了 ...

随机推荐

  1. java中&和&& | 和||的区别

    我想很多人在学习java的时候,或者其他语言(如:C#,.Net等)都会遇到 &和&& 然而,如果你没有真正的理解他们的意思,这会给你思路上面带来很大的麻烦 在这篇blog中, ...

  2. Grafana简单使用

    下载安装 Grafana也是用GO语言写的,无任何依赖,安装非常简单. 启动 sudo service grafana-server start 运行 直接访问:http://your_ip:3000 ...

  3. bzoj5249 [2018多省省队联测]IIIDX

    转化一下问题变成给定一棵树,一个序列,求父亲的权值小于子树的最大方案. 直接贪心会在有重复权值时出现错误,我们考虑用线段树优化贪心. 将序列从小到大排序,线段树上每个点记录他和他右边当前还可用的权值, ...

  4. java 判断是否为中文字符,部分,。中文符号不能识别

    public static void main(String[] args) { int i = 0; for (char c : ",.判断一个字符串是否有中文一般情况是利用Unicode ...

  5. PPT分享第01季-226套多种风格模板

    包含商务欧美扁平风.唯美文艺IOS风.互联网计划书风.扁平风手绘风卡通风 .中国风等多种风格 下面是部分模板截图: 下面是下载地址

  6. 详解线程池execute和submit用法

    在使用线程池时,我们都知道线程池有两种提交任务的方式,那么他们有什么区别呢? 1.execute提交的是Runnable类型的任务,而submit提交的是Callable或者Runnable类型的任务 ...

  7. 从壹开始微服务 [ DDD ] 之终篇 ║当事件溯源 遇上 粉丝活动

    回首 哈喽~大家好,时间过的真快,关于DDD领域驱动设计的讲解基本就差不多了,本来想着周四再开一篇,感觉没有太多的内容了,剩下的一个就是验证的问题,就和之前的JWT很类似,就不打开一个章节了,而且这个 ...

  8. user 不在 sudoers 文件中。此事将被报告。

    在使用sudo -i或su root命令时,被提示出“user不在 sudoers 文件中.此事将被报告”的错误信息.这是因为当前登录的账号不在sudo权限里面.sudo命令可以让你以root身份执行 ...

  9. 从git仓库导入idea的gradle项目无法添加依赖包问题

    引言 之前将项目导入到git仓库,后来同事从git仓库将项目导入到本地,发现无法导入依赖包. 解决方法 这个勾idea是默认勾上的,意思是idea将默认使用本地离线工作模式,使用的是本地仓库,每次依赖 ...

  10. Asp.NetCore轻松学-使用Docker进行容器化托管

    前言 没有 docker 部署的程序是不完整的,在写了 IIS/Centos/Supervisor 3篇托管介绍文章后,终于来到了容器化部署,博客园里面有关于 docker 部署的文章比比皆是,作为硬 ...