Cracking the Coding Interview(Stacks and Queues)
Cracking the Coding Interview(Stacks and Queues)
1.Describe how you could use a single array to implement three stacks.
我的思路:一般堆栈的实现会利用一个数组,这里一个数组若实现3个堆栈,直接考虑把数组划分为3个部分,相当于3个独立的数组,所以就有以下的实现。
但是,这种实现方式的缺点在于均分了每个stack需要的space,但是事先无法确定每个stack是否需要更多的space相比于其他的stack。但是针对这个缺陷我没有想到解决的方案。但是书中提供了一种解决思路。
class stack_share_array{public: int top; int gap; stack_share_array(int initnum,int gap_dis):top(initnum),gap(gap_dis) { } void push(int num) { array[top] = num; top += gap; } int pop() { top -= gap; int result = array[top]; return result; } static int array[15];}; |
分成3个使用方法如下使用:
stack_share_array* stackthree[3];for (int i = 0;i < 3;i++){ stackthree[i] = new stack_share_array(i,3);}int test1 = 10;int test2 = 20;int test3 = 30;stackthree[0]->push(test1++);stackthree[0]->push(test1++);stackthree[0]->push(test1++);stackthree[0]->push(test1++);stackthree[0]->push(test1++);stackthree[1]->push(test2++);stackthree[1]->push(test2++);stackthree[1]->push(test2++);stackthree[1]->push(test2++);stackthree[1]->push(test2++);stackthree[2]->push(test3++);stackthree[2]->push(test3++);stackthree[2]->push(test3++);stackthree[2]->push(test3++);stackthree[2]->push(test3++); |
3种划分方式多种多样,不限于上限的实现。也可以不等分的划分。
另一种思路:一种在数组里面形成链表的思路,及每个数组单元重新定义,除了保存堆栈的存储信息之外保存前一个元素的信息,方便堆栈顶部的向前移动。这样就能够比较自由的分配3个堆栈所占数组的空间。
2.How would you design a stack which,in addition to push and pop,also has a function min which returns the minimum element?Push,pop and min should all operate in O(1) time.
我的思路:
因为min要能够在O(1)能够返回结果,所以min的操作必定之前保存的应该有记录。我第一直觉是用一个int保存最小值,但是细细想一下,如果pop()之后无法确保这个最小值是否被pop(),如果pop()了,无法更新余下的最小值,思考了很久之后发现可以保存一个根据当前top值来返回min的min数组,从开始堆栈内容为0的时候进行记录。所以这个数组的长度应该与设计堆栈的数组的长度相同。
class stack_min{public: int array[15]; int min_array[16]; int top; stack_min():top(0) { min_array[0] = BIG; } void push(int num) { array[top] = num; top ++; if (num < min_array[top - 1]) { min_array[top] = num; } else { min_array[top] = min_array[top - 1]; } } int pop() { top --; int result = array[top]; return result; } int min() { return min_array[top]; }}; |
这样空间复杂度有些高,书中提供另外一种能够节约空间复杂度的算法。
思路是将min数组设计为一个堆栈,这样就能够不需要重复保存很多冗余的最小值。因为利用数组会重复保存同样的最小值多次。
3.Imagine a (Literal) stack of plates.If the stack gets too high,it might topple.Therefore,in real life,we would likely start a new stack when the previous stack exceeds some threshold, Implement a data structure SetOfStacks that mimics this.SetOfStacks should be composed of several stacks, and should create a new stack once the previous one exceeds capacity.SetOfStacks.push() and SetOfStacks.pop() should behave identically to a single stack (that is,pop() should return the same values as it would if there were just a single stack).
Follow up
Implement a function popAt(int index) which performs a pop operation on a specific sub-stack.
class Stack{public: int top; int array[10]; Stack():top(0) { } void push(int num) { array[top] = num; top ++; } int pop() { top --; int result = array[top]; return result; }};class setofstacks{public: Stack* stackArray[10]; int x; setofstacks():x(0) { for (int i = 0;i < 10;i++) { stackArray[i] = new Stack(); } } void push(int num) { if (stackArray[x]->top < 10) { stackArray[x]->push(num); } else { x++; push(num); } } int pop() { if (stackArray[x]->top > 0) { return stackArray[x]->pop(); } else { x--; return pop(); } } int popAt(int index) { return stackArray[index]->pop(); }}; |
上面我的实现有这些问题。
首先,数组长度固定,如果最后一个堆栈用完,无法扩展数组长度。
其次,popAt(index)之后也许需要把后面的元素向前挪动,不然就会出现类似内存碎片一样的无法利用的空间。
4.Write a program to move the disks from the first rod to the last using Stacks.
关于汉诺塔的问题一直都是递归的经典问题,但是一般都是计算时间复杂度的举例,利用堆栈模拟这个过程还真不太会...
模拟的过程实习也是一个实际问题转换为编程问题,需要进行一些抽象化。
class Tower{public: // stack<int>* disks; int num; Tower(int i):num(i) { disks = new stack<int>(); } int index() { return num; } void add(int d) { if (!disks->empty() && disks->top() <= d) { return; } else { disks->push(d); } } void movetopto(Tower* t) { int top = disks->top(); disks->pop(); t->add(top); cout<<"Move disk"<<top<<"from"<<index()<<"to"<<t->index()<<endl; } void moveDisks(int n,Tower* dst,Tower* buffer) { if (n>0) { moveDisks(n-1,buffer,dst); movetopto(dst); buffer->moveDisks(n-1,dst,this); } }}; |
5.Implement a MyQueue class which implements a queue using two stacks.
class queue{public: Stack* stacktwo[2]; queue() { for (int i = 0;i < 2;i++) { stacktwo[i] = new Stack(); } } void push(int num) { stacktwo[0]->push(num); } int pop() { if (stacktwo[1]->top == 0) { while (stacktwo[0]->top != 0) { stacktwo[1]->push(stacktwo[0]->pop()); } } return stacktwo[1]->pop(); }}; |
一个堆栈存放push()进来的元素,pop()的时候直接pop()另外一个堆栈,如果空了则将第一个堆栈中的元素添加进来,再执行pop()操作,这样两次之后就是先进先出的队列。
6.Write a program to sort a stack in ascending order.You should not make any assumptions about how the stack is implemented.The following are the only functions that should be used to write this program:push|pop|peek|isEmpty.
copy code from the book:
public static Stack<Interger> sort(Stack<Integer> s){ Stack<Integer> r = new Stack<Integer>(); while(!s.isEmpty()) { int tmp = s.pop(); while(!r.isEmpty() && r.peek() > tmp) s.push(r.pop()); r.push(tmp) } return r;} |
Cracking the Coding Interview(Stacks and Queues)的更多相关文章
- Cracking the Coding Interview(Trees and Graphs)
Cracking the Coding Interview(Trees and Graphs) 树和图的训练平时相对很少,还是要加强训练一些树和图的基础算法.自己对树节点的设计应该不是很合理,多多少少 ...
- 二刷Cracking the Coding Interview(CC150第五版)
第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或 ...
- Cracking the Coding Interview(linked list)
第二章的内容主要是关于链表的一些问题. 基础代码: class LinkNode { public: int linknum; LinkNode *next; int isvisit; protect ...
- Cracking the Coding Interview(String and array)
1.1实现一个算法判断一个字符串是否存在重复字符.如果不能利用另外的数据结构又该如何实现? My solution: /** *利用类似一个hash table的计数 *然后检查这个hash tabl ...
- Cracking the coding interview
写在开头 最近忙于论文的开题等工作,还有阿里的实习笔试,被虐的还行,说还行是因为自己的水平或者说是自己准备的还没有达到他们所需要人才的水平,所以就想找一本面试的书<Cracking the co ...
- Cracking the coding interview 第一章问题及解答
Cracking the coding interview 第一章问题及解答 不管是不是要挪地方,面试题具有很好的联系代码总用,参加新工作的半年里,做的大多是探索性的工作,反而代码写得少了,不高兴,最 ...
- 《Cracking the Coding Interview》读书笔记
<Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...
- Cracking the coding interview目录及资料收集
前言 <Cracking the coding interview>是一本被许多人极力推荐的程序员面试书籍, 详情可见:http://www.careercup.com/book. 第六版 ...
- Cracking the Coding Interview 150题(二)
3.栈与队列 3.1 描述如何只用一个数组来实现三个栈. 3.2 请设计一个栈,除pop与push方法,还支持min方法,可返回栈元素中的最小值.pop.push和min三个方法的时间复杂度必须为O( ...
随机推荐
- ocp11g培训内部教材_052课堂笔记(042)_体系架构
OCP 052 课堂笔记 目录 第一部分: Oracle体系架构... 4 第一章:实例与数据库... 4 1.Oracle 网络架构及应用环境... 4 2.Oracle 体系结构... 4 3. ...
- Zepto Code Rush 2014——Dungeons and Candies
题目链接 题意: k个点,每一个点都是一个n * m的char型矩阵.对与每一个点,权值为n * m或者找到一个之前的点,取两个矩阵相应位置不同的字符个数乘以w.找到一个序列,使得全部点的权值和最小 ...
- jsp的<%%>
于jsp于 可以使用<% %> 嵌入java代码,简称jsp文字. 可以使用<% -- -- %> 凝视,这是jsp注视 可以使用<%! %> 声明全局变量 版权声 ...
- 数据结构与算法之递推算法 C++与PHP实现
数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的.往往是在发展一种算法的时候,构建了适合于这样的算法的数据结构.一种数据结构假设脱离了算法,也就没有存在的价值了. 算法的作用----解决 ...
- 算法 & 分析 (收集)
算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通 ...
- java界面编程(8) ------ 组合框(下拉列表)
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 与一组单选button的功能类似,组合框(下拉列表)也是强制用户从一组可能的元素 ...
- sql server 辅助工具
sql Prompt 智能感知, 也是需要注册机. 效果如图: 这里最好改下:
- java语言内部类和匿名内部类
内部类 在类定义也有类,在该类上的内部被称为一个内部类. 访问功能: 1,内部类可以直接访问外部类成员,它包含私有成员 2,外部类需要访问内部类的成员将需要建立一流的内部对象. 一般用于类的设计. 分 ...
- linux open
一直记住不打开文件时候的mode,今天发现原来可以直接用0644这样的八进制数字代替,好开森 #include <stdio.h> #include <sys/types.h> ...
- HDU Redraw Beautiful Drawings 推断最大流是否唯一解
点击打开链接 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 ...