【Day28】力扣算法(超详细思路+注释) [1790. 仅执行一次字符串交换能否使两个字符串相等 ] [328. 奇偶链表 ][148. 排序链表]

news/2024/5/2 21:59:44/文章来源:https://blog.csdn.net/ebb29bbe/article/details/127261434

在这里插入图片描述

刷题打卡,第 二十八 天

  • 题目一、1790. 仅执行一次字符串交换能否使两个字符串相等
  • 题目二、328. 奇偶链表
  • 题目三、148. 排序链表


题目一、1790. 仅执行一次字符串交换能否使两个字符串相等

原题链接:1790. 仅执行一次字符串交换能否使两个字符串相等

题目描述

给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。
如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。
/
示例 1:
输入:s1 = “bank”, s2 = “kanb”
输出:true
解释:例如,交换 s2 中的第一个和最后一个字符可以得到 “bank”
/
示例 2:
输入:s1 = “attack”, s2 = “defend”
输出:false
解释:一次字符串交换无法使两个字符串相等
/
示例 3:
输入:s1 = “kelb”, s2 = “kelb”
输出:true
解释:两个字符串已经相等,所以不需要进行字符串交换
/
示例 4:
输入:s1 = “abcd”, s2 = “dcba”
输出:false
/
提示:

  • 1 <= s1.length, s2.length <= 100
  • s1.length == s2.length
  • s1 和 s2 仅由小写英文字母组成

解题思路
题目已经给定我们两个长度相同字符串s1s2,要求我们判断字符串s2可否仅通过一次交换得到s1

在最开始,我们应该先判断两个字符串s1s2是否相等,相等就直接返回true即可。

通过思考,我们可以知道,交换一次,就会变动两个位置的字符,同时代表着字符串s2有两个位置的字符是与字符串s1不相同的,这么一来我们就找到了突破点。

我们同时遍历两个字符串,比较两字符串在相同位置的字符是否相等,如果不相等就将下标记录下来。

当我们记录下来的下标数量大于2时,就知道无法 仅执行一次字符串交换使两个字符串相等,直接返回false。

当遍历完成了,我们会得到两种情况:

①被记录下的下标只有一个,这也是无法通过最多一次交换相等的,false;

②被记录的下标有两个,这时候,我们需要判断字符串s2中,交换这两个位置的字符可以使得s2s1相等。相等则返回true,否则返回false;

提交代码

class Solution {public boolean areAlmostEqual(String s1, String s2) {if(s1.equals(s2)) return true;          //两个字符串相等,trueList<Integer> diff = new ArrayList<>(); //使用集合记录不相等字符的位置(下标)for(int i = 0;i < s1.length();++i){     //遍历两个字符串if(s1.charAt(i) != s2.charAt(i))    //相同位置下字符不相等diff.add(i);                        //记录下来if(diff.size() > 2) return false;   //记录下的下标数大于2,false}if(diff.size() == 1) return false;      //只有一个位置不等,也不符合,falseint a = diff.get(0),b = diff.get(1);    //取出记录的下标//判断交换位置后是否与s1相等return s1.charAt(a) == s2.charAt(b) && s2.charAt(a) == s1.charAt(b);}
}

提交结果

在这里插入图片描述


题目二、328. 奇偶链表

原题链接:328. 奇偶链表

题目描述

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
/
示例 1:
在这里插入图片描述
输入: head = [1,2,3,4,5]
输出: [1,3,5,2,4]
/
示例 2:
在这里插入图片描述
输入: head = [2,1,3,5,6,4,7]
输出: [2,3,6,7,1,5,4]
/
提示:

  • n == 链表中的节点数
  • 0 <= n <= 104
  • -106 <= Node.val <= 106

解题思路
第一个节点是奇数,第二个节点是偶数,往后的节点也是 奇数-偶数-奇数--的位置顺序。

题目要求我们将所有奇数节点连在一块,所有偶数节点连在一块,且奇数连链表于偶数链表拼接。

必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。

我们可以创建两个新的链表,分别代表奇数链表 与 偶数链表,第一个节点是奇数,作为奇数链表的头节点;第二个节点为偶数,作为偶数链表的头节点。

因为奇数偶数是交替的,也就是奇数下一个节点为偶数,偶数下一个节点为奇数。我们就可以将所有奇数节点指向其后偶数节点的下一节点,偶数节点也指向其后奇数节点的下一个节点。

当我们遍历完原始链表,也就完成了奇数链表与偶数链表的节点连接,这时候将奇数链表末尾节点指向偶数链表头节点即可。

提交代码

/*** 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; }* }*/
class Solution {public ListNode oddEvenList(ListNode head) {if(head == null) return null;             //链表为空,直接返回空值ListNode odd = head;                      //创建奇数链表,头节点为原始链表的第一个节点ListNode even = head.next;                //创建偶数链表,头节点为原始链表的第二个节点ListNode temp = even;                     //额外创建链表指向偶数链表头节点,方便后续拼接while(temp != null && temp.next != null){ odd.next = temp.next;   //奇数链表节点指向其后偶数节点的下一位置odd = odd.next;         //后移一位temp.next = odd.next;   //偶数数链表节点指向其后奇数节点的下一位置temp = temp.next;       //后移一位}odd.next = even;            //技术链表尾巴节点指向偶数链表头节点return head;                //返回头节点,也是奇数链表的头节点}
}

提交结果

在这里插入图片描述


题目三、148. 排序链表

原题链接:148. 排序链表

题目描述

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
/
示例 1:
在这里插入图片描述
输入:head = [4,2,1,3]
输出:[1,2,3,4]
/
示例 2:
在这里插入图片描述
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
/
示例 3:
输入:head = []
输出:[]
/
提示:

  • 链表中节点的数目在范围 [0, 5 * 104] 内
  • -105 <= Node.val <= 105

解题思路
我们需要给链表节点值进行排序。

我是用的排序方法是归并排序,我们知道,归并排序首先需要获得排序元素的中间元素位置。

但是链表又没有办法向数组那样通过下标获取,所以我们需要使用到快慢指针,快指针一次走两个节点,慢指针一次走一个节点,那么快指针遍历到链表结尾时,我们的慢指针所在位置就是中间节点的位置。

这时候我们借助递归,用同样的方式将每一个子链表通过中间节点平分,最后得到单个的节点,然后相邻的两个节点按照升序合并,这就是归并操作。

我们不断对相邻的两个节点进行归并操作,将归并好的节点按照顺序放入准备好的新链表中,最后返回新链表的头节点即可!

最主要还是理解归并排序的步骤、模板。

提交代码

/*** 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; }* }*/
class Solution {public ListNode sortList(ListNode head) {return sort(head,null);               //调用递归方法}//递归方法public ListNode sort(ListNode head,ListNode tail){if(head == null){      //头节点为空,返回空值return head;}if(head.next == tail){ //节点最终平分至单节点head.next = null;  //结点指向空值return head;       //返回节点}ListNode fast = head,slow = head;  //设置快慢指针while(fast != tail){               //快指针遍历到结尾前slow = slow.next;              //满指针后移fast = fast.next;              //快指针后移if(fast != tail){              //依旧未到尾部fast = fast.next;              //快指针第二次后移}}ListNode mid = slow;               //中间节点就是满指针当前节点ListNode list1 = sort(head,mid);   //同样方式平分左子链表ListNode list2 = sort(mid,tail);   //同样方式平分右子链表ListNode sorted = merge(list1,list2);  //调用归并操作方法return sorted;                         //返回升序链表头节点}public static ListNode merge(ListNode list1,ListNode list2){//创建新的链表,存放升序节点ListNode list = new ListNode();ListNode temp1 = list1;    //两个相邻的链表ListNode temp2 = list2;ListNode temp = list;while(temp1 != null && temp2 != null){ //对相邻链表进行归并操作if(temp1.val <= temp2.val){        //较小的节点放入链表temp.next = temp1;temp1 = temp1.next; }else{temp.next = temp2;             //较小的节点放入链表temp2 = temp2.next;            }temp = temp.next;}if(temp1 != null){          //一个链表遍历完,相邻链表剩下的一个节点存入新链表temp.next = temp1;}if(temp2 != null){temp.next = temp2;}return list.next;           //返回升序链表}
}

提交结果

在这里插入图片描述



求关注⚽ 作者🥇 .29. 🥇 的✔博客主页✔
来刷题⚽ 记录每日LeetCode✔刷题专栏✔
您的点赞收藏以及关注是对作者最大的鼓励喔 ~~

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

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

相关文章

消息队列的一些思考

前言 像我们Feign进行服务远程调用就会出现上述情况&#xff0c;服务调用是同步的&#xff0c;需要保证整个链路成功执行完才能成功下单&#xff0c;需要考虑网络抖动等影响&#xff0c;还有雪崩的现象——>同步通信会产生不稳定的影响导致用户体验较差 (41条消息) Dubbo_…

【前端笔试之输入输出问题汇总】系列1

1、题目1&#xff1a;涉及到new Array()以及map方面的一些特性 const array new Array(5).map((item) > {return item {name: 1} }) console.log(array)//[empty*5]一般我们认为会输出[name,name,name,name,name]。但是输出的却是empty。 因为new Array(5)生成的数组在每…

CAD导入Revit缺少东西原因-Revit中如何批量导出CAD图纸

一、CAD导入Revit缺少东西原因汇总 在Revit中导入CAD进行模型搭建是建模过程中常用的方法&#xff0c;但是有时会遇到导入的CAD缺少东西的情况&#xff0c;下面介绍几种导致这种问题的原因 1.CAD导入的时候&#xff0c;不是设置为全部可见。 CAD导入Revit中时&#xff0c;“图层…

护眼灯色温多少对眼睛好?推荐色温4000K暖白光的护眼灯

色温就是指温度的颜色&#xff0c;通常人眼所见的光线&#xff0c;由7中色光的光谱所组成&#xff0c;而护眼灯的光源越接近自然光就越好&#xff0c;一般要求色温在4000K左右比较合适&#xff0c;灯光为暖黄光&#xff0c;既温馨有符合相应的亮度&#xff0c;可以起到很好保护…

ROS2在ROS1 的基础的改进点

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、为什么要推出ROS2【重构ROS1】二、ROS1存在的问题三、ROS1与ROS2架构对比四、ROS2新概念例举五、ROS安装版本&#xff08;…

【SpringCloud学习笔记】Feign

Feign 的使用 什么是Feign Feign是声明性的web服务客户端。它使编写web服务客户端更加容易&#xff0c;它封装类Ribbon和RestTemplate Feign vs OpenFeign 1、Feign是Netflix公司写的&#xff0c;是SpringCloud组件中的一个轻量级RESTful的HTTP服务客户端&#xff0c;是Spring…

C/C++里危险的宏(Macro)

#define SQUARE(x) x*x 上述宏定义SQUARE(x)用于求“参数”x的平方&#xff0c;这个宏很容易被使用者误认为是函数。宏是由预处理器处理的&#xff0c;它有着函数的形式却没有函数调用的代价。我们不建议初学者使用宏&#xff0c;因为使用宏的收益远不足以抵消其带给初学者的风…

基于本地存储LVM新建虚机方案

文章目录基于本地存储LVM新建虚机方案date: 2021/12/22auth: mmwei3一、环境信息如下&#xff1a;二、需求方案&#xff1a;1、虚机(卷启动)系统盘数据盘 三者在同一计算节点。2、虚机可以挂本计算节点的数据盘也可以挂载其他计算节点的数据盘。3、虚机可以使用本节点上的HDD做…

大数据必学Java基础(七十六):创建线程的三种方式

文章目录 创建线程的三种方式 一、继承Thread类 二、实现Runnable接口 三、实现Callable接口 创建线程的三种方式 一、继承Thread类 在学习多线程之前&#xff0c;以前的代码是单线程的吗&#xff1f; 不是&#xff0c;以前也是有三个线程同时执行的。 现在我想自己制造…

《单元测试》Junit5入门教程——非常详细,入门即精通

本文为在霍格沃兹测试开发学社中学习到的一些技术&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 单元测试-Junit5入门教程一、添加Junit5依赖二、Junit5 常用注解2.1、Test2.2、BeforeAll2.3、AfterAll2.4、BeforeEac…

JavaWeb学习5:Maven

Maven的学习为什么要学习这个技术?在javaweb开发中,需要使用大量的jar包,这种jar包需要手动的导入 如何让一个东西自动导入和配置jar包 所以Maven诞生了maven就是一个架构管理工具 1、Maven项目架构管理工具 Maven的核心思想:约定大于配置,有约束,不要去违反。 Maven会规…

做过的题

菜就多练 主要记录的是 dp 题(因为大部分都不会),还有一些思维题,还有一些 tricks,还有一些模板类的题。 CF533B Work Group 简要题意: 给定一棵树,要求选定一些点加入点集,使得这些点的权值和最大,且对于点集中的任意一个点,其子树中恰有奇数个点(可能包括它本身)…

(附源码)计算机毕业设计SSM基于java的云顶博客系统

&#xff08;附源码&#xff09;计算机毕业设计SSM基于java的云顶博客系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

easyrecovery数据恢复软件15版本功能介绍

easyrecovery恢复文件介绍 easyrecovery是一款功能非常强大的数据恢复软件&#xff0c;不仅能够恢复手机等终端被删除的文件&#xff0c;还可以恢复从硬盘上删除的文件&#xff0c;而且操作非常简单&#xff0c;下面就跟着小编一起来看一下吧。 easyrecovery可以恢复任何被从…

为了不手动命名驼峰变量名,我开发了一套油猴脚本...

前言 你知道程序员最经常做的事是什么吗&#xff1f;是取变量名&#xff01; 我们常规取变量名的方式是这样的&#xff0c;打开谷歌搜索或者有道搜索&#xff0c;输入变量的中文名&#xff0c;然后复制翻译结果&#xff0c;转到编译器改为驼峰命名&#xff0c;大致流程如下&a…

(外观检测图像增强)阿丘科技AQCV1.0 计算视觉库

阿丘科技计算视觉库 AQCV 专为开发人员的工业机器视觉应用而设计&#xff0c;有较强的灵活性。AQCV 允许开发 人员能够高效开发项目需要的程序&#xff0c;可以配合AIDI&#xff0c;为实际检测应用赋能。 基础图像处理:滤波、几何变换、极坐标展开 特征分析:Blob分析、轮廓分析…

腾讯地图api-基本用法总结

一、序言 前段时间呢&#xff0c;由于工作原因研究了百度地图api的基本用法。百度地图用法点击查看 所以开始对地图产生了点兴趣&#xff0c;最近花了几个时间研究了下腾讯地图的基本使用。 只要是个cv程序员&#xff0c;快的话可能只要1个小时就能上手&#xff0c;慢的话最多…

java毕业设计基于spring框架的论坛网站项目设计和源码

一、主题 榴莲社区——java开发基于spring框架的论坛网站&#xff0c;基于spring框架的论坛网站项目设计和项目 源 码 免 费下 载 链 接 如 下&#xff1a; 毕业设计项目基于spring框架的论坛网站源码.zip-Javascript文档类资源-CSDN下载毕业设计项目基于spring框架的论坛网…

笔试强训(二十一)

目录一、选择题二、编程题2.1 MP3光标位置2.1.1 题目2.1.2 题解2.2 洗牌2.2.1 题目2.2.2 题解一、选择题 &#xff08;1&#xff09;下列叙述错误的是&#xff08;B&#xff09; A.二叉链表是二叉树的存储结构 B.循环链表是循环队列的存储结构 C.栈是线性结构 D.循环队列是队列…

你会知道有关原型与原型链题的那些事~

你还会想知道的有关的原型 在之前总结中&#xff0c;有总结到一些关于原型与原型链的知识点。本来还想加一下各类笔试中&#xff0c;有关原型与原型链的题目&#xff0c;后面忙着忙着给忘了&#xff0c;现在补上&#xff0c;同时也加深一下自己的理解。 首先还是得把这个图先…