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

    1 HTTP概念 把握三个点: 1 HTTP协议(超文本传输协议) HTTP是一个基于TCP/IP通信协议来传递数据,默认端口80 2 HTTP是无连接(限制每次连接只处理一个请求),无状态的(对于事 ...

  2. 【爆料】-《维多利亚大学毕业证书》Victoria一模一样原件

    ☞维多利亚大学毕业证书[微/Q:865121257◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归& ...

  3. appium在android 7.0真机上运行报错command failed shell:............ps:'uiautomator"的解决方式

    appium版本:1_4_16 在CSDN中找到相关解决的方案,根据此解决方案顺利的解决了让人惆怅的问题,再次记录. 1.找到appium安装目录下的adb.js文件,目录为:Appium\node_ ...

  4. layui导航栏和layui.layui.msg问题

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(二)

    作品已经完成,先上源码: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,这是第二篇,主要讲述发送端程序的原理和过程. 第一 ...

  6. 零基础怎么学java

    首先告诉你的是,作为一个初学者想转行学习Java并不是很容易,Java本身是具有一定难度的,虽然说兴趣这东西可以让我们学习不累,但是有多少人学习是因为兴趣,或者有多少人知道自己的兴趣在哪?所以我很明确 ...

  7. [Inside HotSpot] C1编译器HIR的构造

    1. 简介 这篇文章可以说是Christian Wimmer硕士论文Linear Scan Register Allocation for the Java HotSpot™ Client Compi ...

  8. asp.net core系列 44 Web应用 布局

    一.概述 MVC的视图与Razor页面经常共享视觉和程序元素,通过使用布局来完成,布局还可减少重复代码.本章演示了以下内容的操作方法:(1)使用通用布局,(2)自定义布局,(3) 共享指令,(4)在呈 ...

  9. 微服务(入门三):netcore ocelot api网关结合consul服务发现

    简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...

  10. WPF 小小案列(同步异步)

    private void BtnButton_Click(object sender, RoutedEventArgs e) { MessageBox.Show("hello Word&qu ...