今天开始记录一下剑指offer的题目训练,提升一下自己的编程能力吧

题目一:

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例 1:

输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

大致讲下我的思路吧,其实是比较简单的一道栈的题目。使用两个栈,因为明确规定了只能用栈操作,所以只使用数据的pop和push方法,对栈顶进行增删。

栈1用来根据 append 函数的传参对数据进行push操作,将数据一个一个压到栈1,

栈2是将栈1 使用pop方法,将栈1 的最新数据一个一个压到栈2。

这样子,我们就根据数据进来的顺序和倒序分别存储到了一个栈1和栈2

根据题目实现的操作就是先进先出,但是因为栈只能先进后出,所以创建一个新栈储存先进来的数据,再将其弹出,就实现了先进先出

举例,数据进来的顺序 1,2,3,5,6,栈1的储存结构(push储存):(栈顶)6,5,3,2,1(栈底)

栈2的储存结构(栈1 pop出去再push到栈1):(栈顶)1,2,3,5,6(栈底)

代码如下

var CQueue = function() {
this.stack1=[],
this.stack2=[]
}; /**
* @param {number} value
* @return {void}
*/
CQueue.prototype.appendTail = function(value) {
this.stack1.push(value)
}; /**
* @return {number}
*/
CQueue.prototype.deleteHead = function() {
if(this.stack2.length){
return this.stack2.pop();
}else{
while(this.stack1.length){
this.stack2.push(this.stack1.pop());
}
if(!this.stack2.length){
return -1;
}else{
return this.stack2.pop();
}
}
};

  题目二:

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.

这题个人感觉,知道思路之后会比题目一好写

大概讲下我的思路:同样使用两个栈,

栈 1 只负责push进来储存数据

栈 2 只存储最小值,栈 1 push一个数值,栈 2 就根据栈 2 的栈顶判断跟栈 1 push的值哪个比较小,栈 2 栈顶值小,就push该栈顶值,如果栈 1 的push值比栈 2 栈顶值小,则栈 2 push栈 1 所push的值

难以理解,举例如下:

一:栈 1 :1,2,3,4,5

  栈 2 :1,1,1,1,1

二:栈 1 :0,0,-1,2,-3

  栈 2 :0,0,-1,-1,-3

三:栈 1 :-1,-2,4,0,-5

  栈 2 :-1,-2,-2,-2,-5

当栈1弹出时,栈2也弹出,取栈一的最小值实际就是取栈2 的栈顶值

代码如下

ar MinStack = function() {
this.stake=[]
this.mins=[]
this.minValue=0
}; /**
* @param {number} x
* @return {void}
*/
MinStack.prototype.push = function(x) {
this.stake.push(x)
if(this.mins.length==0){
this.mins.push(x)
this.minValue=x
}else{
if(this.minValue<x){
this.mins.push(this.minValue)
}else{
this.minValue=x
this.mins.push(this.minValue)
}
}
}; /**
* @return {void}
*/
MinStack.prototype.pop = function() {
this.mins.pop()
this.minValue= this.mins[this.mins.length-1]
return this.stake.pop()
}; /**
* @return {number}
*/
MinStack.prototype.top = function() {
return this.stake[this.stake.length-1]
}; /**
* @return {number}
*/
MinStack.prototype.min = function() {
return this.mins[this.mins.length-1]

  

剑指offer——day-1的更多相关文章

  1. 剑指Offer面试题:1.实现Singleton模式

    说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...

  2. 剑指Offer面试题:14.链表的倒数第k个节点

    PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...

  3. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  4. 《剑指offer》面试题11: 数值的整数次方

    面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...

  5. 剑指 Offer 题目汇总索引

    剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格              ...

  6. 面试题目——《剑指Offer》

    1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...

  7. 剑指offer习题集2

    1.把数组排成最小的数 class Solution { public: static bool compare(const string& s1, const string& s2) ...

  8. 剑指offer习题集1

    1.打印二叉树 程序很简单,但是其中犯了一个小错误,死活找不到,写代码要注意啊 这里左右子树,要注意是node->left,结果写成root->left vector<int> ...

  9. 剑指Offer:面试题20——顺时针打印矩阵(java实现)

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...

  10. 牛客网上的剑指offer题目

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...

随机推荐

  1. dotnet 6 在 Win7 系统证书链错误导致 HttpWebRequest 内存泄露

    本文记录我将应用迁移到 dotnet 6 之后,在 Win7 系统上,因为使用 HttpWebRequest 访问一个本地服务,此本地服务开启 https 且证书链在此 Win7 系统上错误,导致应用 ...

  2. Event Loop 是什么?

    Event Loop 是什么? 本文写于 2020 年 12 月 6 日 广义上来说 Event Loop 并不是 JavaScript 独有的概念,他是一个计算机的通用概念. 狭义上来说,只有 No ...

  3. 被迫开始学习Typescript —— class

    TS 的 class 看起来和 ES6 的 Class 有点像,基本上差别不大,除了 可以继承(实现)接口.私有成员.只读等之外. 参考:https://typescript.bootcss.com/ ...

  4. CAD图与互联网地图网页端相互叠加显示技术分析和实现

    需求分析 之前相关的博文中介绍了如果在Web网页端展示CAD图形(唯杰地图云端图纸管理平台 https://vjmap.com/app/cloud),当一些CAD图纸有实际地理坐标位置时,如地形图等, ...

  5. 国内访问 git 慢的方法

    在国内访问 git 的时候,总会存在访问慢或者git clone 的时候报下面的错误 这个时候,我们可以使用代理的方式去进行访问 需要注意的是:你必须存在一个国外的,能够让你快速访问到 GitHub ...

  6. 无线:SSID

    BSSID,SSID,ESSID区别   SSID(Service Set Identifier)   SSID,AP唯一的ID码,许多人认为可以将SSID写成ESSID,其实不然,SSID是个笼统的 ...

  7. 今天才发现ThinkPad的触摸板简直好用!傻乎乎的自己

    最近经常看到这句话,天下武功,唯快不破. 今天才发现ThinkPad的触摸板简直好用! 今天才发现,傻乎乎的自己. 前一阵鼠标不好用了,没有滚轮,一直傻瓜式操作点击浏览器的滚动条... 遇到没有滚动条 ...

  8. python之装饰器补充与递归函数与二分查找

    目录 多层装饰器 有参装饰器 递归函数 基本演示 斐波那契数列 总结 小拓展 算法之二分法 简介 举例 总结 多层装饰器 我们已经知道了语法糖的作用是将装饰对象自动装饰到装饰器中,一个语法糖的应用我们 ...

  9. Linux下添加MySql组件后报无权限问题解决

    Tomcat日志报错如下: Caused by: java.sql.SQLException: Access denied for user 'root'@'localhost' (using pas ...

  10. SQL中如何修改数据库名、表名、列名?

    文章目录 1.SQL中如何修改数据库的名字? 2.SQL中如何修改表的名字? 3.SQL中如何修改列的名字? 4.SQL中如何修改列的数据类型?(未完成,待续) 1.SQL中如何修改数据库名? 语法 ...