Python简单算法题

1.字符串中的第一个唯一字符

python 复制代码
def first_uniq_char(s: str) -> int:
    from collections import Counter
    count = Counter(s)
    for i, ch in enumerate(s):
        if count[ch] == 1:
            return i
    return -1

2. 合并两个有序数组(双指针,in-place)

题目 :给你两个按 非递减顺序 排列的整数数组 nums1nums2,另有两个整数 mn,分别表示 nums1nums2 中的元素个数。请你合并 nums2nums1 中,使合并后的数组同样按非递减顺序排列。
注意nums1 的长度为 m+n,其中前 m 个是有效元素,后面 n 个为 0 占位。
考察点 :逆向双指针、原地修改、避免额外空间
参考代码

python 复制代码
def merge(nums1, m, nums2, n):
    i, j, k = m-1, n-1, m+n-1
    while i >= 0 and j >= 0:
        if nums1[i] > nums2[j]:
            nums1[k] = nums1[i]
            i -= 1
        else:
            nums1[k] = nums2[j]
            j -= 1
        k -= 1
    # 如果 nums2 还有剩余
    while j >= 0:
        nums1[k] = nums2[j]
        j -= 1
        k -= 1

3. 判断链表是否有环(快慢指针)

题目 :给定一个链表,判断链表中是否有环。
考察点 :链表操作、快慢指针、空间复杂度 O(1)
参考代码

题目理解

给定一个链表,判断链表中是否有环。如果链表中某个节点可以通过连续 next 指针再次到达,则说明有环。

核心思路:快慢指针(Floyd判圈算法)

原理

  • 两个指针同时从头节点出发

  • 慢指针每次移动1步

  • 快指针每次移动2步

  • 如果有环,快指针一定会追上慢指针(在环内相遇)

  • 如果无环,快指针会先到达链表末尾(null)

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

def hasCycle(head: ListNode) -> bool:
    # 边界条件:空链表或只有一个节点且无环
    if not head or not head.next:
        return False
    
    slow = head
    fast = head
    
    while fast and fast.next:
        slow = slow.next      # 慢指针走一步
        fast = fast.next.next # 快指针走两步
        
        if slow == fast:      # 相遇,说明有环
            return True
    
    return False              # 快指针到达终点,无环

Q: 如何计算环的长度?

python 复制代码
def cycle_length(head: ListNode) -> int:
    slow = fast = head
    
    # 先找到相遇点
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            # 计算环长度
            length = 1
            fast = fast.next
            while slow != fast:
                fast = fast.next
                length += 1
            return length
    return 0

4. 最长公共前缀(字符串处理)

题目 :编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""
示例["flower","flow","flight"]"fl"
考察点 :字符串遍历、边界处理、工程健壮性(空数组)
参考代码

python 复制代码
def longest_common_prefix(strs):
    if not strs:
        return ""
    prefix = strs[0]
    for s in strs[1:]:
        while not s.startswith(prefix):
            prefix = prefix[:-1]
            if not prefix:
                return ""
    return prefix
相关推荐
CodeStats6 分钟前
《源纹天书》第121-125章:源匠归来——全栈重构与归元圣域的2.0时代
java·开发语言·源纹天书
binbin_527 分钟前
UIAbility 与 WindowStage:窗口创建、加载、销毁的完整链路
开发语言·javascript·深度学习·华为·harmonyos
AI人工智能+电脑小能手7 分钟前
【大白话说Java面试题 第154题】【06_Spring篇】第14题:Spring 支持的 Bean 作用域
java·开发语言·spring·面试
程序员杰哥20 分钟前
接口自动化测试项目框架详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
love530love24 分钟前
AI Agent + 本地 ComfyUI 无头模式实战:关闭 IDE 后 AI 独立重启并完成图文生成
ide·人工智能·windows·python·音视频·agent·devops
FriendshipT24 分钟前
Ultralytics:解读Attention模块
人工智能·pytorch·python·深度学习·目标检测
旖-旎25 分钟前
QT界面优化(6)
开发语言·c++·qt
AI科技星25 分钟前
基于超复数广义分形流形的电磁耦合与缪子反常磁矩几何理论
开发语言·平面·重构·概率论·量子计算·乖乖数学·全域数学
组合缺一30 分钟前
用 ChatModel 构建 LLM 驱动的 Java 应用
java·开发语言·ai·llm·solon·rag
许彰午33 分钟前
73_Python爬虫Scrapy框架入门
爬虫·python·scrapy