Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
前言
数据结构与算法属于开发人员的内功,不管前端技术怎么变,框架怎么更新,版本怎么迭代,它终究是不变的内容。 始终记得在参加字节青训营的时候,月影老师说过的一句话,不要问前端学不学算法。计算机学科的每一位都有必要了解算法,有
写出高质量代码的潜意识。
一、有效的括号
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 测试结果
后续
好了,本篇 力扣-有效的括号 + 合并两个有序链表到这里就结束了,我是邵小白,一个在前端领域摸爬滚打的大三学生,欢迎👍评论。