2019 算法面试相关(leetcode)--栈和队列

2019 iOS面试题大全---全方面剖析面试
2018 iOS面试题---算法相关
1、七种常见的数组排序算法整理(C语言版本)
2、2019 算法面试相关(leetcode)--数组和链表
3、2019 算法面试相关(leetcode)--字符串
4、2019 算法面试相关(leetcode)--栈和队列
5、2019 算法面试相关(leetcode)--优先队列
6、2019 算法面试相关(leetcode)--哈希表
7、2019 算法面试相关(leetcode)--树、二叉树、二叉搜索树
8、2019 算法面试相关(leetcode)--递归与分治
9、2019 算法面试相关(leetcode)--贪心算法
10、2019 算法面试相关(leetcode)--动态规划(Dynamic Programming)
11、2019 算法面试相关(leetcode)--动态规划之背包问题


有效的括号
每日温度
字符串解码

栈和队列都是比较常用的数据结构。栈的应用非常的广泛,比如说,递归函数的实现就是借助于栈保存相关的数据。操作系统中每个线程也会使用栈来保存函数调用涉及到的一些参数和其他变量等。栈最大的一个特点就是先进后出(FILO—First-In/Last-Out)。
队列和栈不同的是,队列是一种先进先出(FIFO—first in first out)的数据结构。

  • 栈的相关方法:
    入栈,s.push(x)
    出栈,s.pop()
    访问栈顶,s.top()
    判断栈空,s.empty()
    访问栈中的元素个数,s.size()

  • 队列的方法与栈大同小异,列举如下:

    入队,q.push(x)
    出队,q.pop()
    访问队首元素,q.front()、访问队尾元素,q.back()
    判断队列空,q.empty()
    访问队列中的元素个数,q.size()

栈的应用场景:
栈最大的特点是先进后出,要合理利用这一点,也就是在循环过程中,遇到暂时用不到的元素或数据,就先入栈,等合适时机再一一出栈。
1.逆序输出
2.语法检查,符号成对出现
3.数制转换
4.二叉树的一些操作
等等

一、 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true
示例 2:

输入: "()[]{}"
输出: true
示例 3:

输入: "(]"
输出: false
示例 4:

输入: "([)]"
输出: false
示例 5:

输入: "{[]}"
输出: true


这里不用考虑括号的优先级,即'([])'也是有效的
这里就可以用栈的思想:遍历字符串,如果是左括号就入栈,如果是右括号,就判断是否和栈顶的左括号是同类型,是就出栈,否则就返回false,循环结束后再去判断栈是否是空的,空的就返回true,否则返回false

var isValid = function(s) {
    
    let stack = []

    for (let i = 0; i < s.length; i++) {

        if(s[i]=="("){

            stack.push(")");

        }else if(s[i]=="["){

            stack.push("]");

        }else if(s[i]=="{"){

            stack.push("}")

        }else if(stack.pop()!=s[i]){

            return false;
        }
    }

    return !stack.length 
};

这里的if else有点多,感觉不够优雅,可以用哈希表来优化下

var isValid = function(s) {
    
    let stack = []

    let dic = {'(':')','[':']','{':'}'}

    for (let i = 0; i < s.length; i++) {

        if(s[i] in dic) stack.push(s[i])
        
        else if(dic[stack.pop()] != s[i]) return false
    }

    return !stack.length 
};

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请输入 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的都是 [30, 100] 范围内的整数。


比较容易想到的就是暴力循环

var dailyTemperatures = function(T) {
    
    let res = []

    for(let i = 0; i < T.length; i++){
        
        let num = 0

        for(let j = i + 1; j < T.length; j++){
            
            if(T[j] > T[i]){

                num = j - i

                break
            }
        }

        res.push(num)
    }

    return res
};

但这种时间复杂度是o(n^2),leetcode上用js跑大概1000ms的样子,并不理想
这里我们可以用栈的思想,遍历数组,将索引入栈,遍历栈,如果元素比栈顶索引对应元素的大,则就可以直接出栈,否则就继续遍历数组

var dailyTemperatures = function(T) {
    
    let res = Array(T.length).fill(0)

    let stack = []

    for(let i = 0; i < T.length; i++){

        if(stack.length){

            while(stack.length && T[stack[stack.length - 1]] < T[i]){

                res[stack[stack.length - 1]] = i - stack.pop()
            }
        }

        stack.push(i)
    }

    return res
};

这样就大大缩短了时间,leetcode上用js跑大概100多ms
三、字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例:

s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".


从题目上,很容易可以看出用栈来解题比较合适
遍历字符串,在没有遇到']'前就先入栈,遇到']'后,反向遍历栈,直到找到'[',将'[]'之间的字符串提取出来,在继续遍历栈,提取出'['前的数字nums,注意该数字nums可能是多位数,提取完后,将提取出来的字符串入栈nums次,继续向后遍历。
遍历结束后,将栈转成字符串返回即可

var decodeString = function(s) {
    
    let res = []

    for (const char of s) {

        if(char == ']'){

            let chars = [];let nums = []

            while(res[res.length - 1] != '['){

                chars.push(res.pop())
            }

            res.pop()

            chars = chars.reverse().join('')

            while(!isNaN(res[res.length - 1])) {

                nums.push(res.pop());
            }

            nums = parseInt(nums.reverse().join('')) 

            for(let i = 0; i < nums; i++){
                
                res.push(chars)
            }
        }
        else res.push(char)
    }

    return res.join('')
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容