news 2026/9/28 1:06:14

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/9/28 18:57:24

LobeChat销售话术优化建议生成

LobeChat销售话术优化建议生成 在销售团队的日常工作中&#xff0c;面对客户异议、价格谈判和需求挖掘时&#xff0c;一句话的表达方式往往决定了成单与否。然而&#xff0c;优秀的话术经验常常依赖于少数“金牌销售”的个人能力&#xff0c;难以规模化复制&#xff1b;而新员工…

作者头像 李华
网站建设 2026/9/28 23:49:42

15人团队,60天,1000万美金ARR:Lovable正在重新定义“软件开发”

image.png大家好&#xff0c;我是01。最近看了一期Lennys Podcast&#xff0c;嘉宾是Lovable的创始人Anton Osika。Lovable这家瑞典AI初创公司&#xff0c;创造了一个在欧洲创业圈前所未有的增长神话&#xff1a;15个人的团队&#xff0c;在产品发布后的60天内&#xff0c;就做…

作者头像 李华
网站建设 2026/9/28 8:08:28

TensorFlow调试报错看不懂?LobeChat帮你解读

TensorFlow调试报错看不懂&#xff1f;LobeChat帮你解读 在训练一个图像分类模型时&#xff0c;你是否曾被控制台里突然弹出的一长串红色错误信息搞得一头雾水&#xff1f;比如这条&#xff1a; InvalidArgumentError: Incompatible shapes: [32,64] vs [64,32][[node MatMul…

作者头像 李华
网站建设 2026/9/28 9:05:45

2026届秋招AI岗位狂潮:大厂招聘激增10倍,这份成功上岸攻略不容错过!

2025年夏末&#xff0c;一场针对2026届毕业生的AI人才争夺战比往年提前了至少一个月打响。阿里巴巴、腾讯、字节跳动、百度等头部企业纷纷抛出规模空前的招聘计划&#xff0c;其中AI相关岗位占比普遍超过60%&#xff0c;部分业务线甚至高达80%至90%。 一场前所未有的秋招正在拉…

作者头像 李华