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
相关推荐
Marst Code7 分钟前
Python 3.9 已停止维护!从 3.9 到 3.14 全版本深度对比,生产环境该选哪个?
开发语言·python
llwszx14 分钟前
【Java/Go后端手撸原生Agent(第九篇):Plan-and-Execute规划模式——从“走一步看一步“到“先谋后动“】
java·python·golang·agent开发·plan模式·规划执行模式
ZJH__GO24 分钟前
网络编程v2--多客户端互通
java·运维·服务器·开发语言·计算机网络
lxw184491251426 分钟前
Python uv 完整使用教程
python·conda·pip·uv
hangyuekejiGEO33 分钟前
临沂GEO技术解析与行业应用方案
人工智能·python
万岳科技系统开发1 小时前
智慧医院小程序开发推动医疗服务流程全面线上化
大数据·开发语言·人工智能
一只小灿灿1 小时前
C++ 修饰符全面详解
开发语言·c++
马里马里奥-1 小时前
从零搭建AI Agent工具链的技术文章大纲
开发语言·qt
不做Java程序猿好多年2 小时前
Java中 String、StringBuffer、StringBuilder 的区别详解
开发语言·python
金銀銅鐵2 小时前
[Python] 用 turtle 来绘制国际象棋棋盘(不含棋子)
python·游戏