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

    luoguP2526_[SHOI2001]小狗散步_二分图匹配 题意: Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点 ...

  2. enumerate取下标

    for index,item in enumerate(product_list): # print(product_list.index(item),item) print(index,item) ...

  3. java创建线程的几种方式,了解一下

    1.继承Thread,重写run()  public class MyThread extends Thread{ @Override public void run() { System.out.p ...

  4. 优化:mysql查询最近一条记录

    下策--查询出结果后将时间排序后取第一条 select * from a where create_time<="2017-03-29 19:30:36" order by ...

  5. Typora + Mathpix Snip,相见恨晚的神器

    word 文档虽然很好,但当我需要输入一大堆公式的时候,word 公式让我疯狂. Why markdown?首先,GitHub 上都在用,那我也得会吧,不然 README.md 怎么写:其次,mark ...

  6. pyspark列合并为一行

    将 dataframe 利用 pyspark 列合并为一行,类似于 sql 的 GROUP_CONCAT 函数.例如如下 dataframe : +----+---+ | s| d| +----+-- ...

  7. 虚拟机设置静态IP配置

    网关 虚拟机的ip设置  vi /etc/sysconfig/network-scripts/ifcfg-eth0 重启网卡 service network restart 测试 ping www.b ...

  8. 『动态』动态JSON万能转换函数 + .Net40 dynamic动态数据绑定

    不废话,调用代码: static void Main(string[] args) { string json = File.ReadAllText("2.txt", Encodi ...

  9. 第9章 设备授权端点(Device Authorization Endpoint) - IdentityModel 中文文档(v1.0.0)

    OAuth 2.0设备流设备授权的客户端库是作为HttpClient扩展方法提供的. 以下代码发送设备授权请求: var client = new HttpClient(); var response ...

  10. ASP .NET SignalR起步

    在网站开发中,时常需要使用消息推送功能,http协议是无状态连接,我们需要一个类似桌面程序中socket保持服务器和客户端连接的技术.signalr就是这样一个技术,他能保持网站页面和服务器的一个长连 ...