【力扣hot100】刷题笔记Day9

news2024/9/22 19:37:04

前言

  • 阴天睡得还挺舒服,9点半才醒,用刷题开启美好新一天!

141. 环形链表 - 力扣(LeetCode)

  • 哈希表

    • class Solution:
          def hasCycle(self, head: Optional[ListNode]) -> bool:
              seen = set()  # 哈希集合
              # seen = {}  # 哈希字典
              cur = head
              while cur:
                  if cur in seen:  # 有重复的节点则有环
                      return True
                  seen.add(cur)  # 直接存节点
                  # seen[cur] = True  # 将节点作为键,值设为True
                  cur = cur.next
              return False
  • 快慢指针

    • class Solution:
          def hasCycle(self, head: Optional[ListNode]) -> bool:
              slow = fast = head  # 乌龟和兔子同时从起点出发
              while fast and fast.next:
                  slow = slow.next  # 乌龟走一步
                  fast = fast.next.next  # 兔子走两步
                  if fast == slow:  # 兔子追上乌龟(套圈),说明有环
                      return True
              return False  # 访问到了链表末尾,无环

142. 环形链表 II - 力扣(LeetCode)

  • 快慢指针

    • class Solution:
          def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
              fast = slow = head
              while fast and fast.next:
                  fast = fast.next.next
                  slow = slow.next
                  if slow == fast:  # 快慢指针相遇,s走了nb,f走了2nb
                      fast = head  # 入口处需要a+nb,s已经走了nb
                      while fast != slow:  # 同时走a就可到达入口
                          fast = fast.next
                          slow = slow.next
                      return fast
              return None

21. 合并两个有序链表 - 力扣(LeetCode)

  • 迭代法

    • class Solution:
          def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
              prehead = ListNode(-1)
              precur = prehead
              while list1 and list2:
                  if list1.val <= list2.val:  # 把较小值接到precur后面
                      precur.next = list1
                      list1 = list1.next
                  else:
                      precur.next = list2
                      list2 = list2.next
                  precur = precur.next  # 记得让precur前进
              # 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
              precur.next = list1 if list1 else list2
              return prehead.next
  • 递归法

    • class Solution:
          def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
              if list1 is None:
                  return list2
              if list2 is None:
                  return list1
              if list1.val < list2.val:
                  list1.next = self.mergeTwoLists(list1.next, list2)
                  return list1
              else:
                  list2.next = self.mergeTwoLists(list2.next, list1)
                  return list2

 2. 两数相加 - 力扣(LeetCode)

  • 模拟——转数字

    • class Solution:
          def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
              # 链表转化为数字
              def getNum(head):
                  num = 0
                  flag = 1
                  while head != None:
                      num += head.val * flag
                      head = head.next
                      flag *= 10
                  return num
              # 计算和    
              twoSum = getNum(l1) + getNum(l2)
              # 和为0直接返回0节点
              if twoSum == 0:
                  return ListNode(0)
              # 循环生成新链表
              head = cur = ListNode(-1)
              while twoSum != 0:
                  cur.next = ListNode(twoSum % 10)
                  cur = cur.next
                  twoSum //= 10  # 整除
              return head.next
  • 模拟——进位

    • class Solution:
          def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
              # 创建一个结点值为 None 的头结点, dummy 和 p 指向头结点, dummy 用来最后返回, p 用来遍历
              dummy = p = ListNode(None)          
              s = 0               # 初始化进位 s 为 0
              while l1 or l2 or s:
                  # 如果 l1 或 l2 存在, 则取l1的值 + l2的值 + s(s初始为0, 如果下面有进位1, 下次加上)
                  s += (l1.val if l1 else 0) + (l2.val if l2 else 0)  
                  p.next = ListNode(s % 10)       # p.next 指向新链表, 用来创建一个新的链表
                  p = p.next                      # p 向后遍历
                  s //= 10                        # 有进位情况则取模, eg. s = 18, 18 // 10 = 1
                  l1 = l1.next if l1 else None    # 如果l1存在, 则向后遍历, 否则为 None
                  l2 = l2.next if l2 else None    # 如果l2存在, 则向后遍历, 否则为 None
              return dummy.next   # 返回 dummy 的下一个节点, 因为 dummy 指向的是空的头结点, 下一个节点才是新建链表的后序节点
  • 递归——进位

    • class Solution:
          def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
              def dfs(l, r, i):
                  # 终止条件:都为空节点且进位为0
                  if not l and not r and not i: return None
                  s = (l.val if l else 0) + (r.val if r else 0) + i
                  node = ListNode(s % 10)  # 当前节点
                  node.next = dfs(l.next if l else None, r.next if r else None, s // 10) # 接上递归链表
                  return node
              return dfs(l1, l2, 0)

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 

  • 双指针

    • class Solution:
          def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
              dummy = ListNode(0, head)  # 直接创建虚拟头节点
              fast = slow = dummy  # 双指针
              # 快指针先走
              while n != 0:
                  fast = fast.next
                  n -= 1
              # 双指针一起走直到fast到底
              while fast.next != None:
                  fast = fast.next
                  slow = slow.next
              # 删除节点
              slow.next = slow.next.next
              return dummy.next

 24. 两两交换链表中的节点 - 力扣(LeetCode)

  • 模拟 ​​​​​

    • class Solution:
          def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
              dummy = ListNode(0, head)
              cur = dummy
              while cur.next and cur.next.next:
                  pre = cur
                  cur = cur.next
                  temp = cur.next.next
                  pre.next = cur.next  # 步骤1
                  pre.next.next = cur  # 步骤2
                  cur.next = temp      # 步骤3
              return dummy.next
  • 递归

    • class Solution:
          def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
              # 终止条件:如果剩0/1个节点,无法交换,直接返回
              if not head or not head.next:
                  return head
              # 交换头两个结点
              newhead = head.next
              head.next = self.swapPairs(newhead.next)  # 接上后面交换好的结果
              newhead.next = head
              return newhead

后言

  • 明天估计是不开组会的,今天猛猛刷了6道题!知识能进脑子的感觉真爽啊! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1464261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web前端3D JS框架和库 整理

在WebGL库和SVG/Canvas元素的支持下&#xff0c;JavaScript变得惊人的强大。几乎可以为网络构建任何东西&#xff0c;包括基于浏览器的游戏和本地应用&#xff0c;许多最新的突破性功能都在3D上运行。 为此&#xff0c;「数维图小编」整理了19个交互式3D Javascript库和框架&am…

龙年加密行业能否迎来发展春天?行业大咖带你探秘投资风口

在过去数年里&#xff0c;加密行业的牛熊市转换&#xff0c;时刻牵动着行业人士的心。无论是初入加密行业的开发新人&#xff0c;还是金融行业经验拉满的投资大佬&#xff0c;都在变动不居的环境下探寻着适应行业发展、捕捉创新机遇的方向。这一过程中&#xff0c;如何专注项目…

(十四)【Jmeter】线程(Threads(Users))之开放模型线程组(Open Model Thread Group)

简述 操作路径如下: 开放模型线程组(Open Model Thread Group) 是 JMeter 5.5 版本中引入的一个新特性,它允许用户创建具有可变负载的负载配置文件。相较于传统的线程组,开放模型线程组提供了更多的灵活性和动态调整的能力。 优点: 灵活性:允许测试人员根据测试需求动…

【EI会议征稿通知】第五届管理科学与工程管理国际学术会议(ICMSEM 2024)

第五届管理科学与工程管理国际学术会议&#xff08;ICMSEM 2024&#xff09; 2024 5th International Conference on Management Science and Engineering Management 第五届管理科学与工程管理国际学术会议 (ICMSEM 2024&#xff09;将于2024年6月07-09日于中国沈阳召开。会…

【MATLAB GUI】 4. 坐标区和表

看B站up主freexyn的freexyn编程实例视频教程系列36Matlab GUI的学习笔记 文章目录 坐标区表 坐标区 任务要求设计一个图像显示界面&#xff0c;根据选定的周期做出相应的sin函数图像 使用坐标区、弹出式菜单、普通按钮设计页面&#xff0c;弹出式菜单string设置为1、2、3、4代…

人工智能会是第四次工业革命吗?引领第四次工业革命的核心力量

许多专家和学者确实认为人工智能&#xff08;AI&#xff09;将是第四次工业革命的核心。第四次工业革命&#xff0c;也被称为"工业4.0"&#xff0c;是指正在发生的一场以高度数字化和互联网为基础的技术革新。 自18世纪的蒸汽机&#xff0c;到20世纪的电力和信息技术…

三次握手,四次挥手的大白话版本

三握四挥 首先我们要知道握手和挥手是在做什么&#xff0c;握手是为了让客户端和服务端建立连接&#xff0c;挥手是为了让客户端和服务端断开连接&#xff0c;握手时客户端主动发起请求&#xff0c;挥手双方都能发起请求。 三次握手 有必要解释一下&#xff0c;SYN的意思是同…

前端基于Verdaccio搭建私有npm仓库,上传npm插件包,及下载使用自己的npm插件包

文章目录 一、原理二、常用的仓库地址三、优势四、准备环境六、使用verdaccio搭建私有npm服务1、安装2、运行3、配置config.yaml&#xff0c;使局域网下能共享访问&#xff0c;否则只能本机访问。4、重新运行 七、npm常见操作查看当前用户信息查看源地址切换源地址删除源地址创…

linux操作系统day2(io文件处理)

二进制文件读写&#xff1a; fread()/fwrite() 读&#xff1a; size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 功能&#xff1a; 从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr 所在的本地内存中。 参数&#xff1a; pt…

多线程相关(3)

线程安全-上 乐观锁&#xff0c;CAS思想java乐观锁机制CAS思想 synchronized底层实现主要的三种使用方法底层实现 ReenTrantLock底层实现使用方法底层实现与synchronized区别 公平锁和非公平锁区别公平锁非公平锁公平锁效率低原因 乐观锁&#xff0c;CAS思想 java乐观锁机制 …

AI分析:使用Ubuntu系统对人的积极影响

我是一个程序员&#xff0c;但代码工作只占日常工作的20%&#xff0c;日常使用office&#xff0c;做报表&#xff0c;写周报&#xff0c;参与网络会议。 我用Ubuntu 22.04作为电脑系统&#xff0c;已经1年半了&#xff0c;今天&#xff0c;终于把系统更新到23.10版本&#xff…

#12解决request中getReader()和getInputStream()只能调用一次的问题

目录 1、背景 2、解决方案 2.1、自定义HttpServletRequestWrapper 2.2、JsonRequestHeaderParamsHelper 2.3、HttpServletRequestReplacedFilter 2.4、使用 1、背景 当前系统Content-Type为application/json&#xff0c;参数接收方式采用RequestBody和RequestParam&#…

云原生高级第一次作业

目录 实验需求&#xff1a; 第一个实验步骤&#xff1a; openEuler 二进制方式安装MySQL 8.0.x 1.首先需要获取软件包 2.然后安装tar和xz格式可进行解压工具 3.接下来就是安装MySQL 4.配置环境变量 5.登入并修改密码 6.停止服务脚本 7.提供配置文件 8.进入/etc/my.cnf…

Backtrader 量化回测实践(2)—— K线16主要形态定义(上)

Backtrader 量化回测实践&#xff08;2&#xff09;—— K线16主要形态定义&#xff08;上&#xff09; K线图形中的趋势线和价格走势能够反映市场的整体趋势&#xff0c;比如是否处于上涨或下跌趋势中。 用Backtrader做策略的时候&#xff0c;需要考虑K线形态&#xff0c;作为…

go RPC编程

1、golang中如何实现RPC golang中实现RPC非常简单&#xff0c;官方提供了封装好的库&#xff0c;还有一些第三方的库 golang官方的net/rpc库使用encoding/gob进行编解码&#xff0c;支持tcp和http数据传输方式&#xff0c;由于其他语言不支持gob编解码方式&#xff0c;所以gol…

JAVA:深入理解原型模式构建可复用对象的关键技术

1、简述 在软件开发中&#xff0c;有时候我们需要创建许多相似但不完全相同的对象&#xff0c;这时候使用原型模式就显得非常有用。原型模式是一种创建型设计模式&#xff0c;它允许我们通过复制现有对象来创建新对象&#xff0c;而无需从头开始构建。本文将深入探讨 Java 中的…

银河麒麟桌面版操作系统修改主机名

1图形化方式修改 1.1在计算机图标上右键&#xff0c;选择属性 1.2修改 1.2.1点击修改计算机名 选择玩属性后会自动跳转到关于中&#xff0c;在计算机名中点击修改图标本质就是设置里面的系统下的关于&#xff0c;我们右键计算机选择属性就直接跳转过来了 1.2.2修改系统名字 …

day05-进程通信

1> 将互斥机制的代码实现重新敲一遍 代码&#xff1a; #include<myhead.h>int num520;//临界资源//1.创建互斥锁 pthread_mutex_t fastmutex;//定义任务函数 void *task1(void *arg){printf("1111111\n");//3.临界区上面获取锁资源&#xff08;上锁&#…

【嵌入式学习】QT-Day2-Qt基础

1> 思维导图 https://lingjun.life/wiki/EmbeddedNote/20QT 2>登录界面优化 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff…

并发编程之深入理解Java线程

并发编程之深入理解Java线程 线程基础知识 线程和进程 进程 程序由指令和数据组成、但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须要将指令加载至CPU、数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的…