hot 100 刷题记录(1)

  1. 两数之和

思路:建一个哈希表(dict),遍历数组,如果target-numsi的值在哈希表里面,返回;否则,存储

python 复制代码
def sum2target(nums, target):
    d = dict()
    for i, num in enumerate(nums):
        if (target - num) in d:
            return [d[target - num], i]
        d[num] = i

2.两数相加

题目:

给定两个非空的链表,表示两个非负整数。

它们每位数字都是按照逆序方式存储的,并且每个节点只能存储一位数字。

请你将这两个数相加,并以相同形式返回一个表示和的链表。

思路:

新建一个链表,遍历两个链表,用temp记录进位

python 复制代码
class ListNode:
    def __init__(self,val=0,next=None):
        self.val=val
        self.next = next

    def add2list(self,headA,headB):
        dummy = ListNode()
        cur = dummy
        temp = 0
        p1 = headA
        p2 = headB
        while p1 or p2 or temp:
            val1 = p1.val if p1 else 0
            val2 = p2.val if p2 else 0
            cur.next = ListNode((val1+val2+temp)%10)
            temp = (val1+val2)//10
            cur = cur.next
            if p1: p1 = p1.next
            if p2: p2 = p2.next
        return dummy.next
    def printList(self,list):
        while list:
            print(list.val, end=" ")
            list = list.next
        print()
headA = ListNode(2)
headA.next = ListNode(4)
headA.next.next = ListNode(3)
headB = ListNode(5)
headB.next = ListNode(6)
headB.next.next = ListNode(4)
s = ListNode()
s.add2list(headA, headB)
s.printList(s.add2list(headA, headB))
  1. 无重复字符的最长子串

题目:给定一个字符串 s,请你找出其中无重复字符的最长子串 的长度。

也就是说,要求子串中的每个字符都不重复,返回这样的最长子串的长度。

思路:滑动窗口

  • 用left和right维护窗口的左右边界。

  • dch记录字符ch最近一次出现的位置。

  • 每次都更新maxlen

  • 核心:

    如果新的ch已经在d里面了,并且位置在left右侧,证明当前窗口里面有这个字符,需要移动left到这个字符之后,保证当前窗口无重复字符

python 复制代码
def maxSubStr(s):
    d = dict()
    left = 0
    maxlen = 0
    for right,ch in enumerate(s):
        if ch in d and d[ch]>=left:
            left = d[ch] + 1
        d[ch] = right
        maxlen = max(maxlen, right - left + 1)
    return maxlen
  1. 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2,请你找出并返回这两个正序数组的中位数

思路:二分查找,找中间元素

python 复制代码
def middleNumArrays(nums1, nums2):
    m, n = len(nums1), len(nums2)
    if m > n:
        nums1, nums2, m, n = nums2, nums1, n, m  # 保证nums1更短
    left, right = 0, m
    while left <= right:
        i = (left + right) // 2
        j = (m + n + 1) // 2 - i
        Aleft = nums1[i-1] if i > 0 else float('-inf')
        Aright = nums1[i] if i < m else float('inf')
        Bleft = nums2[j-1] if j > 0 else float('-inf')
        Bright = nums2[j] if j < n else float('inf')
        
        if Aleft <= Bright and Bleft <= Aright:
            if (m + n) % 2 == 0:
                return (max(Aleft, Bleft) + min(Aright, Bright)) / 2
            else:
                return max(Aleft, Bleft)
        elif Aleft > Bright:
            right = i - 1
        else:
            left = i + 1
  1. 给定一个字符串 s,找到 s 中最长的回文子串,并返回该子串。

思路:中心扩展法,分奇偶长度,从中间开始遍历,返回最大的左右位置

python 复制代码
def expandHuiWen(s, left, right):
    while left >= 0 and right < len(s) and s[left] == s[right]:
        left -= 1
        right += 1
    return left + 1, right - 1  # 返回回文的左右边界

def longestHuiWen(s):
    start, end = 0, 0
    for i in range(len(s)):
        l1, r1 = expandHuiWen(s, i, i)     # 奇数长度
        l2, r2 = expandHuiWen(s, i, i+1)   # 偶数长度
        if r1 - l1 > end - start:
            start, end = l1, r1
        if r2 - l2 > end - start:
            start, end = l2, r2
    return s[start:end+1]
相关推荐
BothSavage3 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn3 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽5 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
荣码5 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
金銀銅鐵16 小时前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li18 小时前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
先吃饱再说21 小时前
判断回文字符串,从一行代码到双指针优化
算法
小九九的爸爸1 天前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程
黄敬峰1 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法