leetcode面试经典算法题——2

链接:https://leetcode.cn/studyplan/top-interview-150/

20. 有效的括号

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"

输出:true

示例 2:

输入:s = "()\[\]{}"

输出:true

示例 3:

输入:s = "(]"

输出:false

Python代码

python 复制代码
class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        # 利用栈先进后出的特点,遇见左符号就进栈,遇见右符号则判断栈顶的符号是否与之匹配。
        len_s = len(s)
        if len_s < 2:
            return False
        for item in s:
            stack_len = len(stack)
            if item == "(" or item == "[" or item == "{":
                stack.append(item)
            if item == ")":
                if stack_len != 0 and stack[-1] == "(":
                    stack.pop()
                else:
                    return False
            elif item == "]":
                if stack_len != 0 and stack[-1] == "[":
                    stack.pop()
                else:
                    return False
            elif item == "}":
                if stack_len != 0 and stack[-1] == "{":
                    stack.pop()
                else:
                    return False
            
            i += 1
        # 操作之后,栈空则全部符合,否则无效
        if len(stack) == 0:
            return True
        else:
            return False
            
                
        
if __name__ == '__main__':
    s = Solution()
    a = "){}"
    print(s.isValid(a))

C++代码

cpp 复制代码
#include <iostream>
#include <stack>
using namespace std;

class Solution {
public:
    bool isValid(string s) {
    // 创建字符栈
        stack<char> myStack; 
        int len_s = s.size();
        if (len_s < 2) return false;
        int i;
        for (i = 0; i < len_s; i++){
            int stack_len = myStack.size(); // 获得栈大小
            if (s[i] == '(' || s[i] == '[' || s[i] == '{')
                    myStack.push(s[i]);
            else if (s[i] == ')') {
                if (stack_len != 0 && myStack.top() == '(') myStack.pop();
                else return false;
            }
            else if (s[i] == ']') {
                if (stack_len != 0 && myStack.top() == '[') myStack.pop();
                else return false;
            }
            else if (s[i] == '}') {
                if (stack_len != 0 && myStack.top() == '{') myStack.pop();
                else return false;
            }
        }
        return myStack.empty(); // 检查栈是否为空
    }
};

int main() {
    Solution s;
    string a = "())";
    cout << s.isValid(a) << endl;
    return 0;
}

141. 环形链表

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

输入:head = 3,2,0,-4, pos = 1

输出:true

解释:链表中有一个环,其尾部连接到第二个节点。

输入:head = 1,2, pos = 0

输出:true

解释:链表中有一个环,其尾部连接到第一个节点。

输入:head = 1, pos = -1

输出:false

解释:链表中没有环。

提示:

  • 链表中节点的数目范围是 0, 10\^4
  • -10^5 <= Node.val <= 10^5
  • pos 为 -1 或者链表中的一个 有效索引 。

Python代码

python 复制代码
# Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None


class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        # 使用快慢指针,快指针每次走两个结点,慢指针每次走一个结点,当快指针遇上慢指针则存在环
        fast = head
        slow = head
        while fast:
            if fast.next:
                fast = fast.next.next
            else:
                break
            slow = slow.next
            if fast == slow:
                return True
            
        return False
def CreateListNode(l1):
    head = ListNode(l1[0])
    node = head
    for i in range(1, len(l1)):
        new_head = ListNode(l1[i])
        node.next = new_head
        node = new_head
    return head

21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

输入:l1 = 1,2,4, l2 = 1,3,4

输出:1,1,2,3,4,4

示例 2:

输入:l1 = \[\], l2 = \[\]

输出:\[\]
示例 3:

输入:l1 = \[\], l2 = 0

输出:0

提示:

相关推荐
卷福同学4 小时前
不用服务器,不用配环境,我10分钟上线了一个AI Agent
人工智能·后端·算法
至乐活着6 小时前
深入解析跳表SkipList:原理、实现与性能优化实战
数据结构·算法·跳表·skiplist·java实现
Jerry7 小时前
LeetCode 383. 赎金信
算法
ai产品老杨7 小时前
H264 H265视频分析常见问题和排查清单
人工智能·算法·音视频
Jerry7 小时前
LeetCode 454. 四数相加 II
算法
可编程芯片开发8 小时前
基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真
算法
Jerry8 小时前
LeetCode 202. 快乐数
算法
hans汉斯9 小时前
基于改进交叉熵损失函数与Transformer的心电信号高风险分类研究
功能测试·深度学习·算法·yolo·目标检测·分类·transformer
Jerry9 小时前
LeetCode 349. 两个数组的交集
算法
YuK.W10 小时前
Leetcode100: 70.爬楼梯、118.杨辉三角、198.打家劫舍
java·算法·leetcode