今天学习的时间虽然挺多的,但是总觉效率不高。其实今天没有按照计划进行EPI题目的浏览,白天去看了其他的书籍。准备找工作可能需要的状态是一定量经典的书,偶尔温习才可。书是看不完的,知识点也是固定的。所以从把手头的几本书在浏览完毕之后就要着手复习之前的知识啦。C++的知识,leetcode的题目,操作系统,数据库,网络的学习笔记~。

1. 实现一个栈,支持返回当前栈中最大值的操作。要求,返回最大值的操作时间复杂度O(1)。可以使用额外的O(n)的空间复杂度。

题目之前见到过,所以思路一下子就有了,利用额外的栈存储当前栈中最大值即可。

简单的思路,在元素入栈的时候,辅助栈同时压入当前栈的最大值,元素出栈的时候,弹出辅助栈的元素。取得最大值直接从辅助栈栈頂获取即可。

另外,可以减少一下压入辅助栈中的元素的数量,只有压入当前栈的元素大于等于当前辅助栈栈顶元素,才将该至压入辅助栈栈顶,出栈的时候,只有出栈元素等于辅助栈栈顶元素时,才将辅助栈栈顶弹出。

另外,能在常数项更优化的一个方法是,辅助栈中压入一个数对,数对的意义是当前的最大值,以及当前最大值的数量,push的时候如果相等,则增加数对的第二个值,pop的时候如果相等,减去数对中的第二个值,如果减至0,则pop辅助栈即可。

扩展问题,实现一个队列,支持返回当前最大值的操作,能否优化至O(1)的时间复杂度。

这个题目还是比较复杂的,需要结合两个知识来把时间复杂度均摊为O(1),及利用两个已经实现最大值操作的堆栈来模拟队列,可以达到均摊O(1)复杂度的返回最大值的队列。

其实利用deque也能够达到O(1)的均摊成本,但是时间复杂度分析比较复杂。

均摊的理解是每个元素最多进入D和离开D一次,不会第二次进入和离开D。所以入队的均摊O(1)。

2.实现逆波兰表达式的计算并返回计算结果。

利用栈不断的压入数字,遇到运算符号,从数字栈中取出两个数字进行计算,结果继续压入数字栈,直到计算完毕,数字栈中存储的运算结果。

3.迭代方法实现BST的中序遍历。

利用栈的迭代实现不是很复杂,而且可以完成O(1)空间复杂度的morris中序遍历。

而且迭代实现二叉树的遍历方法中,后序遍历的实现是难度最大的。morris的后序遍历实现起来难度也很大。

4.针对随机链表,即除了next域之外,增加一个random指针域的链表,迭代的方法进行random-first序的遍历。

递归的方法比较容易实现,这里让进行迭代即利用stack来模拟递归的方法即可。

template <typename T>
void search_postings_list(const shared_ptr<node_t<T> > &L) {
stack<shared_ptr<node_t<T> > > s;
int order = 0;
s.emplace(L);
while(!s.empty()) {
shared_ptr<node_t<T> > curr = s.top();
s.pop();
if( curr && curr->order == -1 ) {
curr->order = order++;
s.emplace(curr->next);
s.emplace(curr->jump);
}
}
}

5.利用栈记录汉诺塔的移动过程,模拟。

void transfer(const int &n, array<stack<int>,3> &pegs, const int &from, const int & to, const int &use) {
if(n > 0) {
transfer(n-1,pegs,from,use,to);
pegs[to].push(pegs[from].top());
pegs[from].pop();
cout<<"Move from peg"<<from<<"to peg"<<to<<endl;
transfer(n-1,pegs,use,to,from);
}
}
void move_tower_hanoi(const int &n) {
array<stack<int>,3> pegs;
for(int i = n;i >= 1;--i) {
pegs[0].push(i);
}
transfer(n,pegs,0,1,2);
}

6.一排楼房所有的窗户都面朝西,太阳落下的时候如果一个楼房的西面不存在比该楼房高的楼房,则该楼房可以看到阳光,从东至西计算出所有可以看到阳光的楼房。

扩展问题:从西至东计算出所有可以看到阳光的楼房。

问题的根本思路是利用栈,从东至西维护一个递减的序列。从西至东则需要维护一个递增的序列。其中序列的内容及为可看到阳光的楼房。这种利用栈维护单调序列的方法在求最大直方图面积中应用可以减少时间复杂度至O(n)。

从东至西的递减序列code

template <typename T>
vector<pair<int,T>> examine_buildings_with_sunset(istringstream &sin) {
int idx = 0;//building's index
T height;
//Stores(buiding_idx,building_height) pair with sunset views
vector<pair<int,T> > buildings_with_sunset;
while(sin >> height) {
while(buildings_with_sunset.empty() == false && height >= buildings_with_sunset.back().second) {
buildings_with_sunset.pop_back();
}
buildings_with_sunset.emplace_back(idx++,height);
}
return buildings_with_sunset;
} 

7.设计一个排序堆栈的算法仅仅利用push,pop,empty,top操作,并且不显示的开辟额外空间。

如果不显示的开辟额外空间,就想想利用函数递归调用的堆栈存储信息,这样就能够进行排序。比如插入排序的递归实现方法。

template <typename T>
void sort(stack<T> &S) {
if(!S.emtpy()) {
T e = S.top();
S.pop();
sort(S);
insert(S,e);
}
}
template <typename T>
void insert(stack<T> &S,const T &e) {
if(S.empty() || S.top() <= e) {
S.push(e);
}else {
T f = S.top();
S.pop();
insert(S,e);
S.push(f);
}
}

8.将包含..和.的文件路径名简化至最短路径。

思路就是保持一个栈,当遇到..的时候讲栈顶的目录名弹出,遇到.则忽略。这样就可以得到最短路径了。该题目边界情况较多,属于细节题。

9.层序遍历BST的方法。

层序遍历,即广度优先搜索,需要借助队列来完成功能。

10.利用两个整数实现一个队列的功能。队列中能够加入的元素为[0,9]。

首先看到这个题目想到的是将整数看成位数组,4位可以表示[0,15]之间的数字,所以可以当成数组。

后来参考答案看到按照十进制的位来表示[0,9]计算起来更加方便。刚好十进制的每位都是[0,9],一个数字作为数组,另外一个数字作为队列的长度。注意全为0的边界情况。

扩展问题:如果只有一个整数,可以使用其中一位保存长度。

11.利用两个栈实现一个队列,使得pop和push的均摊成本O(1)。

一个栈负责进入队列,另外一个栈负责弹出队列。

12.O(1)返回队列max值的队列的应用。

    应用场景是现在有一个数组,数组是一个数对,第一个元素表示一个时间戳,第二个元素表示该事件的流量,数组已经根据时间戳有序的,现在需要计算每个时间戳至时间戳+w这段时间内的最大流量是多少。

如果直接解法则需要遍历当前时间戳的流量至当前时间戳+w这段时间内所有流量,时间复杂度O(nw)。

如果利用优先队列的话因为是最小堆实现的,所以可以优化至O(nlogw)的时间复杂度。

如果利用O(1)返回最大值的队列,则优化至了O(n)的时间复杂度。

栈和队列的基础算法学习(EPI)的更多相关文章

  1. [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)

    再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...

  2. 用JS描述的数据结构及算法表示——栈和队列(基础版)

    前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...

  3. 四旋翼基础算法学习2-IMU输入滤波算法

    前言: 处理器读取陀螺仪加速度计数据后首先需要对数据进行滤波处理,此文分析比较几种常用的滤波算法. 参考学习:四轴加速度计滤波 IMU: IMU使用MPU9250(即MPU6500),设置加速度量程± ...

  4. 基础算法学习2-dp

    一.算法题: 最大子阵 给定一个n×m 的矩阵 A,求A 中的一个非空子矩阵,使这个子矩阵中的元素和最大.其中,A 的子矩阵指在 A 中行和列均连续的一部分.输入格式输入的第一行包含两个整数 n,m( ...

  5. 基础算法学习以及$STL$的使用

    1.优先队列 (1)大根堆(小顶堆) priority_queue<int,vector<int>,greater<int> >q; (2)小根堆(大顶堆) pri ...

  6. C++基础算法学习——逆波兰表达式问题

    例题:逆波兰表达式逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 ...

  7. C++基础算法学习——N皇后问题

    n皇后问题:输入整数n, 要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案. 代码如下: #include <iostream> #include<cmath& ...

  8. C++基础算法学习——汉洛塔问题

    汉诺塔问题古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图).有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中, ...

  9. C++基础算法学习——熄灯问题

    有一个由按钮组成的矩阵, 其中每行有6个按钮, 共5行– 每个按钮的位置上有一盏灯– 当按下一个按钮后, 该按钮以及周围位置(上边, 下边,左边, 右边)的灯都会改变状态26熄灯问题 POJ1222– ...

随机推荐

  1. swig和angular双花括号的冲突

    swig和angular都用{{name}}来作为模板中变量的取值, 那么要共用的话怎么办: {% raw %}{{ foobar }}{% endraw %} 或者 config(['$interp ...

  2. 和我一起学《HTTP权威指南》——连接管理

    连接管理 1.TCP连接 几乎所有的HTTP通信都是由TCP/IP承载的. 浏览网页时客户端执行的操作: 如浏览http://www.joes-hardware.com:80/power-tools. ...

  3. python05 - 迭代器,生成器,装饰器

    迭代器 迭代器就是访问集合元素的一种方式,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问一遍后结束. 迭代器很大的特点: 只能往前迭代,不能够回退,也不能随机访问其中一个元素,只能通过__ ...

  4. php解析出带层级关系的mpp文件

    本来要使用DHX gantt插件自带的API做导入,可是做完后,又发现不稳定,不能访问了 可能是屏蔽掉了 所以又想起可以使用javaBridge,借用java的MPXJ php解析mpp的 上一篇介绍 ...

  5. windows 下为Python安装redis

    最近在看<redis实战>,里面的redis示例都是Python写的,先将环境整好 启动redis redis-server.exe  redis.conf 安装了python2.7 安装 ...

  6. nginx配置:location配置方法及实例

    转载:https://blog.csdn.net/heiyueya/article/details/70149270 location匹配的是nginx的哪个变量? $request_uri loca ...

  7. [CNN] What is Convolutional Neural Network

    Ref: 从LeNet-5看卷积神经网络CNNs 关于这篇论文的一些博文的QAC: 1. 基本原理 MLP(Multilayer Perceptron,多层感知器)是一种前向神经网络(如下图所示),相 ...

  8. ab压测札记(Apache Bench)

    1 ab安装 ab实际上是apache httpd里面的一个工具或者说子模块,安装apache httpd可以参考另一篇文章JBOSS集群的2.3节 安装目录:/apache目录/bin/,如下 2 ...

  9. java的子类覆盖梗

    项目上线,用户注册时验证码一直报错误,数据库也没问题,代码貌似也没问题. 后面排查到最后,发现是一个子类覆盖父属性问题. JAVA代码中,子类覆盖父类的私有.保护属性,如果不设置get.set方法,拿 ...

  10. SpringBoot thymeleaf模板版本,thymeleaf模板更换版本

    SpringBoot thymeleaf模板版本 thymeleaf模板更换版本 修改thymeleaf模板版本 ================================ ©Copyright ...