力扣热门算法题 59. 螺旋矩阵 II,60. 排列序列,61. 旋转链表

59. 螺旋矩阵 II,60. 排列序列,61. 旋转链表,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.21 可通过leetcode所有测试用例。

目录

59. 螺旋矩阵 II

解题思路

完整代码

Java

Python

60. 排列序列

解题思路

完整代码

Java

Python

61. 旋转链表

解题思路

解题思路:

完整代码

Java

Python


59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 20

解题思路

完整代码

Java
public class Solution {public int[][] generateMatrix(int n) {int[][] matrix = new int[n][n];int num = 1;int top = 0, bottom = n - 1, left = 0, right = n - 1;while (left <= right && top <= bottom) {for (int i = left; i <= right; i++) {matrix[top][i] = num++;}top++;for (int i = top; i <= bottom; i++) {matrix[i][right] = num++;}right--;for (int i = right; i >= left; i--) {matrix[bottom][i] = num++;}bottom--;for (int i = bottom; i >= top; i--) {matrix[i][left] = num++;}left++;}return matrix;}
}
Python
class Solution:def generateMatrix(self, n: int) -> List[List[int]]:if n == 1:return [[1]]matrix = [[0] * n for _ in range(n)]num, top, bottom, left, right = 1, 0, n - 1, 0, n - 1while left <= right and top <= bottom:for i in range(left, right + 1):matrix[top][i] = numnum += 1top += 1for i in range(top, bottom + 1):matrix[i][right] = numnum += 1right -= 1for i in range(right, left - 1, -1):matrix[bottom][i] = numnum += 1bottom -= 1for i in range(bottom, top - 1, -1):matrix[i][left] = numnum += 1left += 1return matrix

60. 排列序列

给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

给定 n 和 k,返回第 k 个排列。

示例 1:

输入:n = 3, k = 3
输出:"213"

示例 2:

输入:n = 4, k = 9
输出:"2314"

示例 3:

输入:n = 3, k = 1
输出:"123"

解题思路

  1. 初始化:创建一个列表 numbers 存储从 1 到 n 的所有数字,用于构造排列。同时,计算 (n-1)!(记为 factorial),因为在固定第一个数字的情况下,后面的数字可以形成 (n-1)! 种排列。

  2. 调整 k:由于列表的索引从 0 开始,但排列是从 1 开始计数的,所以先将 k 减去 1,以便与索引对齐。

  3. 构造排列:遍历从 0 到 n-1 的每个位置,对于每个位置:

    • 确定该位置上的数字应该是 numbers 中的哪一个。这可以通过将 k 除以当前的 factorial 值得到。这会给出当前位置应该使用 numbers 中的哪个数字。
    • 更新 k 为 k 除以 factorial 的余数,为下一个位置的计算做准备。
    • 更新 factorialfactorial 除以当前的剩余数字的数量,因为每确定一个数字后,剩余可选数字就减少一个。
    • numbers 中移除已经使用过的数字,确保不会重复使用。
  4. 返回结果:将步骤 3 中确定的数字连接起来,形成字符串作为最终答案。

完整代码

Java
public class Solution {public String getPermutation(int n, int k) {List<Integer> numbers = new ArrayList<>();int factorial = 1;for (int i = 1; i <= n; i++) {numbers.add(i);factorial *= i;}k--;  // 将 k 转换为基于 0 的索引StringBuilder answer = new StringBuilder();for (int i = 0; i < n; i++) {factorial /= (n - i);int index = k / factorial;k %= factorial;answer.append(numbers.get(index));numbers.remove(index);}return answer.toString();}
}
Python
class Solution:def getPermutation(self, n: int, k: int) -> str:numbers = list(range(1, n+1))factorial = 1for i in range(1, n):factorial *= ik -= 1  # 将 k 转换为基于 0 的索引answer = []for i in range(n-1, -1, -1):index = k // factorialk %= factorialif i != 0:factorial //= ianswer.append(str(numbers[index]))numbers.pop(index)return ''.join(answer)

61. 旋转链表

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

示例 2:

输入:head = [0,1,2], k = 4
输出:[2,0,1]

提示:

  • 链表中节点的数目在范围 [0, 500] 内
  • -100 <= Node.val <= 100

解题思路

旋转链表意味着将链表的后部分移动到链表的前部分。为了实现这一点,我们可以遵循以下步骤:

解题思路:

  1. 链表长度和尾节点:首先遍历链表以确定链表的长度 n,并在此过程中获得链表的尾节点。这一步骤有助于我们理解需要移动多少个节点以及如何连接链表的尾部到头部。

  2. 计算实际移动次数:由于链表的长度是固定的,如果移动次数 k 大于链表长度 n,那么移动 k 次实际上等同于移动 k % n 次(因为每移动 n 次,链表就会恢复到原始状态)。因此,我们只需要移动 k % n 次。

  3. 找到新的头节点:新的头节点将是从链表尾部数起的第 k % n 个节点的下一个节点。因此,我们需要从头节点开始,移动 (n - k % n - 1) 次来找到新的尾节点。

  4. 执行旋转:将当前的尾节点(新的尾节点)的 next 指针指向原来的头节点,将原来的尾节点的 next 指针指向 null,并更新头节点为新的头节点。

完整代码

Java
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
public class Solution {public ListNode rotateRight(ListNode head, int k) {if (head == null || head.next == null || k == 0) return head;// 计算链表长度并获取尾节点int length = 1;ListNode tail = head;while (tail.next != null) {tail = tail.next;length++;}// 计算需要移动的实际次数k = k % length;if (k == 0) return head;// 找到新的尾节点ListNode newTail = head;for (int i = 0; i < length - k - 1; i++) {newTail = newTail.next;}// 执行旋转ListNode newHead = newTail.next;newTail.next = null;tail.next = head;return newHead;}
}
Python
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:if not head or not head.next or k == 0:return head# 计算链表长度并获取尾节点length, tail = 1, headwhile tail.next:tail = tail.nextlength += 1# 计算需要移动的实际次数k = k % lengthif k == 0:return head# 找到新的尾节点new_tail = headfor _ in range(length - k - 1):new_tail = new_tail.next# 执行旋转new_head = new_tail.nextnew_tail.next = Nonetail.next = headreturn new_head

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

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

相关文章

adb logcat 命令使用

adb logcat 命令-CSDN博客 c fork, execl 参数 logcat | grep-CSDN博客 一.命令格式 adb logcat [选项] [过滤项], 其中 选项 和 过滤项 在 中括号 [] 中, 说明这是可选的; 选项解析: 1."-s"选项 : 只显示指定标签的日志; ------>adb logcat -s SWVDEC 显示SWVDE…

IDEA 2021.3.3最新激活破解教程(可激活至2099年,亲测有效)

下载地址&#xff1a;https://files.cnblogs.com/files/smallfa/ja-netfilter-all.rar?t1684636896&downloadtruehttps://files.cnblogs.com/files/smallfa/ja-netfilter-all.rar?t1684636896&downloadtrue1.Windows 系统下载解压到文件夹内&#xff0c;点击运行 ins…

就业班 2401--3.13 走进网络

走进网络 长风破浪会有时&#xff0c;直挂云帆济沧海。 1.认识计算机 1.计算机网络是由计算机和通讯构成的&#xff0c;网络研究的是“通信”。 ------1946 世界上第一台计算机 2.终端&#xff1a;只有输入和输出功能&#xff0c;没有计算和处理功能。 3.数据&#xff1a;一串…

js截取网址参数值方法

一般分为两种网址截取方法&#xff1a; 第一种&#xff0c;例如链接&#xff1a;http://192.168.32.135:9020/#/authentication/Login?toeknceshi token 值出现在 URL 的 hash 部分,所以你需要使用 window.location.hash 来获取 hash 部分&#xff0c;然后使用 URLSearchPara…

学点儿Java_Day6_面向对象:类、封装、构造方法

1 类 1.1 定义 类&#xff1a;对现实世界中事物的抽象。Student 对象&#xff1a;现实世界中具体的个体。张三、李四 这些具体的学生 面向对象的特征&#xff1a;抽象、封装、继承、多态 OOP: Object Oriented Programming 类和对象的总结&#xff1a; 1、现实世界都是由很多…

JAVA多线程之JMM

文章目录 1. Java内存模型2. 内存交互3. 三大特性3.1 可见性3.1.1 可见性问题3.1.2 原因3.1.3 解决方法 3.2 原子性3.3 有序性 在继续学习JUC之前&#xff0c;我们现在这里介绍一下Java内存模型&#xff0c;也就是JMM&#xff0c;进而引出关键字volatile的使用条件。 1. Java内…

vue中动态显示时间

我也是参考别人的。 代码如下 export default {name: Preview,data() {return {timer: undefined,nowTime: new Date(),};},created() {// 要显示时间&#xff0c;在渲染页面之前一直调用该函数&#xff0c;对this.time进行赋值开启定时this.timer setInterval(() > {//时…

相机的内外参数标定和畸变矫正原理和代码

相机的成像过程实质上是坐标系转换。首先空间中的点坐标由世界坐标系转换到相机坐标系&#xff0c;然后将其投影到成像平面&#xff08;图像物理坐标系&#xff09;&#xff0c;最后再将成像平面上的数据转换到图像像素坐标系。但是由于透镜制造精度及组装工艺的差别会引入畸变…

【SQL】1251. 平均售价(IFNULL函数)

前述 知识点回顾&#xff1a;MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用 题目描述 leetcode题目&#xff1a;1251. 平均售价 Code select P.product_id,ifnull(round(sum(units * price) / sum(units), 2), 0) as average_price from Prices P left join UnitsS…

无痕消除笔APP好用吗?3款超实用软件分享

无痕消除笔APP好用吗&#xff1f;在日常生活中&#xff0c;无痕消除笔APP的便捷性不言而喻。无论是想要去除照片中的小瑕疵&#xff0c;还是快速修正文案中的错别字&#xff0c;这款工具都能迅速而精准地满足需求。它不仅提升了我们处理图片和文本的效率&#xff0c;还让我们的…

一个Flash编程错误标志的探析

1、问题描述 客户项目中使用的 MCU 型号是 STM32G0B1, 他们反馈在代码中尝试擦除并编程 FLASH时, 发现 FLASH 的状态寄存器显示编程错误(如图 1 所示). 问题是当前代码还没有开始擦除和编程, 怎么就有了编程错误标志了呢 ? 如果不将此错误标志清除, 后续的编程操作无法继续.客…

vue2 table 页面 + 功能 展示

首页代码 <!-- 首页展示页面 弹框展示 --> <template><div style><el-button type"text" size"small" click"dailys()">测试跳转</el-button><!-- <div class"dingwei"><a href"#…

LeetCode 面试经典150题 134.加油站

题目&#xff1a; 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数…

How to install mongodb on redhat 7.7

下载rpm: mongodb-enterprise-server-6.0.3-1.el7.x86_64.rpmmongodb-org-server-6.0.4-1.el7.x86_64.rpmmongodb-mms-6.0.9.100.20230201T2148Z.x86_64.rpm rpm -ivh mongodb-org-server-6.0.4-1.el7.x86_64.rpm rpm -ivh mongodb-mms-6.0.9.100.20230201T2148Z.x86_64.rpm …

【 Redux 】 Redux中间件的理解?常用的中间件有哪些?实现原理?

1. 是什么 中间件(Middleware)是介于应用系统和系统软件之间的一类软件&#xff0c;它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用&#xff0c;能够达到资源共享、功能共享的目的 那么如果需要支持异步操作&#xff0c;或者支持错误处理、日…

【办公类-16-07-07】“2023下学期 大班户外游戏2(有场地和无场地版,每天不同场地)”(python 排班表系列)

作品展示 背景需求&#xff1a; 2024年2月教务组发放的是“每周五天内容相同&#xff0c;两周10天内容相同”的户外游戏安排 【办公类-16-07-05】合并版“2023下学期 大班户外游戏&#xff08;有场地和无场地版&#xff0c;两周一次&#xff09;”&#xff08;python 排班表系…

css预处理器scss的使用如何全局引入

目录 scss 基本功能 1、嵌套 2、变量 $ 3、mixin 和 include 4、extend 5、import scss 在项目中的使用 1、存放 scss 文件 2、引入 variables 和 mixins 2-1、局部引入 2-2、全局引入 3、入口文件中引入其他文件 项目中使用 css 预处理器&#xff0c;可以提高 cs…

Uibot6.0 (RPA财务机器人师资培训第1天 )RPA+AI、RPA基础语法

训练网站&#xff1a;泓江科技 (lessonplan.cn)https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981(本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; 紧接着小北之前的几篇博客&#xff0c;友友们我们即将开展新课的学习~…

InsCode是一个集成了在线IDE、在线AI编程、在线算力租赁、在线项目部署以及在线SD 模型使用的综合代码开发平台。

一、 Stable Diffusion 模型在线使用   InsCode是一个集成了在线IDE、在线AI编程、在线算力租赁、在线项目部署以及在线SD 模型使用的综合代码开发平台。 Stable Diffusion是目前最火的AI绘画工具之一&#xff0c;它是一个免费开源的项目。通过Stable Diffusion&#xff0c;…

Python爬取网站数据

Python爬取网站数据 前言 什么是爬虫&#xff1f; 通过编写程序&#xff0c;模拟浏览器上网&#xff0c;然后让其去互联网上抓取数据的过程 爬虫合法还是违法&#xff1f; 在法律上是不被禁止的但是也有违法风险 爬虫带来的风险可以体现在如下2方面 爬虫干扰了被访问网站…