news 2026/4/23 12:26:49

Leetcode刷题日记16(151-160)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Leetcode刷题日记16(151-160)

目录

  • 问题1:
    • 问题链接:
    • 问题描述:
    • 实例:
    • 代码:
  • 问题2:
    • 问题链接:
    • 问题描述:
    • 实例:
    • 代码:
  • 问题3:
    • 问题链接:
    • 问题描述:
    • 实例:
    • 代码:
  • 问题4:
    • 问题链接:
    • 问题描述:
    • 实例:
    • 代码:
  • 问题5:
    • 问题链接:
    • 问题描述:
    • 实例:
    • 代码:
  • 问题6:
    • 问题链接:
    • 问题描述:
    • 实例:
    • 代码:

问题1:

问题链接:

151. 反转字符串中的单词

问题描述:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

实例:

示例1: 输入:s="the sky is blue" 输出:"blue is sky the" 示例2: 输入:s=" hello world " 输出:"world hello" 解释:反转后的字符串中不能存在前导空格和尾随空格。 示例3: 输入:s="a good example" 输出:"example good a" 解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

代码:

classSolution:defreverseWords(self,s:str)->str:s=s.strip()# 删除首尾空格i=j=len(s)-1res=[]whilei>=0:whilei>=0ands[i]!=' ':i-=1# 搜索首个空格res.append(s[i+1:j+1])# 添加单词whilei>=0ands[i]==' ':i-=1# 跳过单词间空格j=i# j 指向下个单词的尾字符return' '.join(res)# 拼接并返回

问题2:

问题链接:

152. 乘积最大子数组

问题描述:

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续 子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 测试用例的答案是一个32-位 整数。 请注意,一个只包含一个元素的数组的乘积是这个元素的值。

实例:

示例1:输入:nums=[2,3,-2,4]输出:6解释:子数组[2,3]有最大乘积6。 示例2:输入:nums=[-2,0,-1]输出:0解释:结果不能为2,因为[-2,-1]不是子数组。

代码:

classSolution:defmaxProduct(self,nums:List[int])->int:n=len(nums)f_max=[0]*n f_min=[0]*n f_max[0]=f_min[0]=nums[0]foriinrange(1,n):x=nums[i]# 把 x 加到右端点为 i-1 的(乘积最大/最小)子数组后面,# 或者单独组成一个子数组,只有 x 一个元素f_max[i]=max(f_max[i-1]*x,f_min[i-1]*x,x)f_min[i]=min(f_max[i-1]*x,f_min[i-1]*x,x)returnmax(f_max)

问题3:

问题链接:

153. 寻找旋转排序数组中的最小值

问题描述:

已知一个长度为 n 的数组,预先按照升序排列,经由1到 n 次 旋转 后,得到输入数组。例如,原数组 nums=[0,1,2,4,5,6,7]在变化后可能得到: 若旋转4次,则可以得到[4,5,6,7,0,1,2]若旋转7次,则可以得到[0,1,2,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次 的结果为数组[a[n-1],a[0],a[1],a[2],...,a[n-2]]。 给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。 你必须设计一个时间复杂度为O(log n)的算法解决此问题。

实例:

示例1: 输入:nums=[3,4,5,1,2]输出:1解释:原数组为[1,2,3,4,5],旋转3次得到输入数组。 示例2: 输入:nums=[4,5,6,7,0,1,2]输出:0解释:原数组为[0,1,2,4,5,6,7],旋转4次得到输入数组。 示例3: 输入:nums=[11,13,15,17]输出:11解释:原数组为[11,13,15,17],旋转4次得到输入数组。

代码:

classSolution:deffindMin(self,nums:List[int])->int:left,right=0,len(nums)-1whileleft<=right:mid=(left+right)//2ifnums[mid]>nums[-1]:left=mid+1else:right=mid-1returnnums[left]

问题4:

问题链接:

154. 寻找旋转排序数组中的最小值 II

问题描述:

已知一个长度为 n 的数组,预先按照升序排列,经由1到 n 次 旋转 后,得到输入数组。例如,原数组 nums=[0,1,4,4,5,6,7]在变化后可能得到: 若旋转4次,则可以得到[4,5,6,7,0,1,4]若旋转7次,则可以得到[0,1,4,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次 的结果为数组[a[n-1],a[0],a[1],a[2],...,a[n-2]]。 给你一个可能存在 重复 元素值的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。 你必须尽可能减少整个过程的操作步骤。

实例:

示例1: 输入:nums=[1,3,5]输出:1示例2: 输入:nums=[2,2,2,0,1]输出:0

代码:

classSolution:deffindMin(self,nums:[int])->int:nums=sorted(nums)returnnums[0]
classSolution:deffindMin(self,nums:[int])->int:i,j=0,len(nums)-1#关于选择点这里,左边的都要大于右边的数据whilei<j:m=(i+j)//2ifnums[m]>nums[j]:i=m+1elifnums[m]<nums[j]:j=melse:returnmin(nums[i:j])returnnums[i]

问题5:

问题链接:

155. 最小栈

问题描述:

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类:MinStack()初始化堆栈对象。 voidpush(int val)将元素val推入堆栈。 voidpop()删除堆栈顶部的元素。 inttop()获取堆栈顶部的元素。 intgetMin()获取堆栈中的最小元素。

实例:

示例1:输入:["MinStack","push","push","push","getMin","pop","top","getMin"][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,null,-3,null,0,-2]解释: MinStack minStack=newMinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.getMin();-->返回-3.minStack.pop();minStack.top();-->返回0.minStack.getMin();-->返回-2.

代码:

classMinStack:def__init__(self):self.stack=[]self.min_stack=[]defpush(self,val:int)->None:self.stack.append(val)ifnotself.min_stackorval<=self.min_stack[-1]:self.min_stack.append(val)defpop(self)->None:ifself.stack.pop()==self.min_stack[-1]:self.min_stack.pop()deftop(self)->int:returnself.stack[-1]defgetMin(self)->int:returnself.min_stack[-1]

问题6:

问题链接:

160. 相交链表

问题描述:

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后,链表必须 保持其原始结构 。 自定义评测: 评测系统 的输入如下(你设计的程序 不适用 此输入): intersectVal-相交的起始节点的值。如果不存在相交节点,这一值为0listA-第一个链表 listB-第二个链表 skipA-在 listA 中(从头节点开始)跳到交叉节点的节点数 skipB-在 listB 中(从头节点开始)跳到交叉节点的节点数 评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。

实例:

代码:

# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = NoneclassSolution:defgetIntersectionNode(self,headA:ListNode,headB:ListNode)->Optional[ListNode]:#假设公共部分是z,上半段是x,下半段是y,在(x+z)+y=(y+z)+x,意思就说两者都开始走,走完以后再走对方的路,x走y,y走x,会相遇,如果没相遇则是有空节点。p,q=headA,headBwhilepisnotq:ifp:p=p.nextelse:p=headBifq:q=q.nextelse:q=headAreturnp
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 2:15:03

10章 数据共享操作 - “Vega“ 7nm Instruction Set ArchitectureReference Guide

本地数据共享&#xff08;LDS&#xff09;是一种极低延迟、用于临时数据的RAM暂存器&#xff0c;其有效带宽至少比直接、无缓存的全局内存高出一个数量级。它允许工作组内的工作项之间共享数据&#xff0c;并用于保存像素着色器参数插值所需的参数。与只读缓存不同&#xff0c;…

作者头像 李华
网站建设 2026/4/19 18:15:29

hot100 283.移动零

一、方法一&#xff1a;把nums当作栈。用一个栈记录非零元素。1.思路&#xff1a;&#xff08;1&#xff09;以示例1为例&#xff0c;nums [0,1,0,3,12]&#xff0c;判断过程如下表所示。&#xff08;2&#xff09;最后&#xff0c;再在栈的末尾添加两个零&#xff0c;即为答案…

作者头像 李华
网站建设 2026/4/23 11:45:47

17、使用Python作为Bash脚本的替代方案

使用Python作为Bash脚本的替代方案 1. Python中的重要空格概念 Python与大多数其他语言的一个主要区别在于额外的空格是有意义的。在Python里,代码的缩进级别定义了它所属的代码块。不像其他语言使用花括号或者 do 和 done 关键字来定义代码块,Python使用缩进来实现这一…

作者头像 李华
网站建设 2026/4/23 11:50:08

python pandas操作excel

Python的Pandas库是处理Excel文件的强大工具&#xff0c;它提供了简洁高效的接口来读取、处理和分析表格数据。下面将详细介绍使用Pandas操作Excel的核心方法、常见场景及进阶技巧。一、安装与环境准备使用Pandas处理Excel文件前&#xff0c;需要安装Pandas及相应的引擎库&…

作者头像 李华
网站建设 2026/4/23 11:47:39

大雪深埋强化课划重点|保号性专题

&#x1f5fa;️ 专题框架与考点梳理 系统地梳理了微积分中的核心考点&#xff0c;并突出了保号性在其中的地位&#xff1a; 保号性是极限理论中一个核心且非常实用的性质&#xff0c;当“看到极限严格大于或严格小于”某个值时&#xff0c;就应该立刻联想到它。 流程图&…

作者头像 李华