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
相关推荐
老毛肚4 小时前
jeecg-boot-base-core 02 day
javascript·python
yaoxin5211234 小时前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
凡人叶枫4 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
学逆向的5 小时前
C++纯虚函数
开发语言·c++·网络安全
岁月宁静5 小时前
RAG 文档摄入全链路,从原理到生产落地
vue.js·人工智能·python
程序员二叉5 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉5 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
JaydenAI5 小时前
[对比学习LangChain和MAF-07]如何引入人机交互的审批流程
python·ai·langchain·c#·agent·hitl·maf
神奇元创6 小时前
商用级光路加速卡:大模型推理的极速落地方案
python·神经网络·fpga开发·dsp开发
凡人叶枫6 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++