前言
数据结构与算法属于开发人员的内功,不管前端技术怎么变,框架怎么更新,版本怎么迭代,它终究是不变的内容。 始终记得在参加字节青训营的时候,月影老师说过的一句话,不要问前端学不学算法。计算机学科的每一位都有必要了解算法,有
写出高质量代码的潜意识
。
一、有效的括号
1.1 问题描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
示例 4:
输入:s = "([)]" 输出:false
示例 5:
输入:s = "{[]}" 输出:true
提示:
- 1 <= s.length <= 104
- s 仅由括号 '()[]{}' 组成
1.2 思路讲解
本题我们使用栈来模拟括号的匹配,核心思路如下:
- 创建一个stack 栈用于保存括号和取出括号。
- 遇到
{ [ (
等左括号就进栈。 - 遇到
} ] )
等右括号就出栈,出栈的时候判断是否和当前的括号相同。 - 最后判断stack的长度是否为零,为零表示全部匹配完了,返回true。
1.3 AC代码
var isValid = function (s) { const stack = [] for(let i = 0;i < s.length; i++){ const cur = s[i] switch(cur){ case '{': stack.push('}') break; case '[': stack.push(']') break; case '(': stack.push(')') break; default: if(stack.pop()!=cur){ return false } } } return stack.length == 0 }
二、合并两个有序链表
2.1 题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = [] 输出:[]
示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
提示:
- 两个链表的节点数目范围是 [0, 50]
- 100 <= Node.val <= 100
- l1 和 l2 均按 非递减顺序 排列
2.2 思路讲解
题中指出,两个链表都是按照非递减顺序排列的,所以我们的做法也很简单,创建一个新的链表来进行存储,步骤如下:
- 创建一个新链表的虚拟头节点,使用指针p指向该头节点
- 只要list1 或者 list2 有值就不断迭代,每次迭代比较两个链表当前节点的值。
- 值小的插入到新链表当中。 直接看代码吧,比较好理解
2.3 AC代码
/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ var mergeTwoLists = function(list1, list2) { const dommy = new ListNode(-1) let p = dommy while(list1 || list2){ if(list1 && list2){ if(list1.val < list2.val){ p.next = list1 list1 = list1.next }else{ p.next =list2 list2 = list2.next } }else if (list1){ p.next = list1 list1 = list1.next }else { p.next = list2 list2 = list2.next } p = p.next } return dommy.next };
2.5 测试结果
后续
好了,本篇 力扣-有效的括号 + 合并两个有序链表
到这里就结束了,我是邵小白,一个在前端领域摸爬滚打的大三学生,欢迎👍评论。