代码随想录算法训练营Day8 | ● 344.反转字符串● 541. 反转字符串II● 54.替换数字● 151.翻转字符串里的单词● 55.右旋转字符串

(记得重学)

● 344.反转字符串

题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

题目链接:344. 反转字符串

卡哥的视频链接:字符串基础操作! | LeetCode:344.反转字符串

题目思考:和反转链表相似,但是要简单一些

代码示例:

终于有我能一次性直接写出来的题了哈哈哈哈哈哈

代码详解:

  1. 首先,定义了两个变量 leftright,分别表示字符数组的左右两个指针。left 指向数组的第一个字符,而 right 指向数组的最后一个字符。

  2. while 循环中,不断执行以下操作,直到 left 指针大于等于 right 指针:

    • 首先,创建一个临时变量 temp,用于暂存 left 指针指向的字符。
    • 然后,将 right 指针指向的字符赋值给 left 指针指向的位置,实现字符交换。
    • 接着,将 temp 中暂存的字符赋值给 right 指针指向的位置,实现字符交换。
    • 最后,分别将 left 指针和 right 指针向中间移动一位,继续进行下一轮的字符交换。
  3. left 指针不再小于 right 指针时,说明字符数组的所有字符都已经完成了翻转操作,整个循环结束。

这段代码利用了双指针的思想,从字符串的两端开始,逐步向中间移动,交换对应位置上的字符,从而实现了字符串的翻转。这样的算法复杂度为 O(n/2),其中 n 是字符数组的长度。

leetcode提交记录:

小tips:

1.注意数组类型是字符型,新定义temp值的时候别忘了嗷!

2.当right是n时,代表剩下的已经不足k了,则全部交换,当right是i + k时,说明长度在k到2k之间,则转换 i 到 i + k这一部分

● 541. 反转字符串II

题目:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"

提示:

  • 1 <= s.length <= 104
  • s 仅由小写英文组成
  • 1 <= k <= 104
题目链接:541. 反转字符串 II

卡哥的视频链接:字符串操作进阶! | LeetCode:541. 反转字符串II

题目思考:当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。

其实我们要交换的就是i+k这一段的字符串

代码示例:
public class swap_k {public String reverseStr(String s,int k){int n = s.length();char[] c = s.toCharArray();//有时候固定要往前走多少格的时候,可以在for循环上做做文章for (int i = 0; i < n; i += 2*k) {reverse(c,i,Math.min(i + k,n) - 1);}return new String(c);}public void reverse(char[] arr,int left , int right){while(left < right){char temp = arr[left];arr[right] = arr[right];arr[right] = temp;left++;right--;}}
}

代码逻辑详解:

  1. 首先,定义了一个 reverseStr 方法,接受两个参数:字符串 s 和整数 k,表示每隔 k 个字符进行反转。

  2. 在方法内部,首先获取字符串 s 的长度,并将其赋值给变量 n

这段代码利用了双指针的思想和循环遍历数组的方法,以较低的时间复杂度 O(n) 实现了对字符串每隔 k 个字符进行反转。

  • 然后,将字符串 s 转换为字符数组 arr,以便后续操作。

  • 接下来,通过一个 for 循环以步长为 2 * k 遍历字符数组 arr,每次迭代都会处理从 i 开始的 k 个字符的反转。这样可以确保每隔 k 个字符进行反转。

  • 在每次迭代中,调用名为 reverse 的辅助方法,实现对指定子数组的反转操作。reverse 方法接受三个参数:字符数组 arr、反转区间的起始位置 left、反转区间的结束位置 right

  • reverse 方法中,使用双指针法对指定子数组进行反转操作:

    • 初始化左指针 left 和右指针 right,分别指向指定子数组的首尾位置。
    • while 循环中,当 left 指针小于 right 指针时,执行以下操作:
      • left 指针指向的字符与 right 指针指向的字符进行交换。
      • 分别将 left 指针和 right 指针向中间移动一位。
    • left 指针不再小于 right 指针时,说明指定子数组的所有字符都已完成反转操作,循环结束。
  • 每次迭代完成后,整个字符串 s 中每隔 k 个字符的子串都完成了反转操作。

  • 最后,将字符数组 arr 转换回字符串,并将结果返回。

leetcode提交记录:

小tips:

1.注意此题所交换的是字符,定义新变量的时候要注意!

● 54.替换数字

题目:假定一段路径记作字符串 path,其中以 "." 作为分隔符。现需将路径加密,加密方法为将 path 中的分隔符替换为空格 " ",请返回加密后的字符串。

示例 1:

输入:path = "a.aef.qerf.bb"输出:"a aef qerf bb"

题目链接:LCR 122. 路径加密

题目思考:因为String不可以修改,所以只能申请一段新的空间

代码示例:

● 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”
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

题目链接:151. 反转字符串中的单词

卡哥的视频链接:字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词

                                                                                                                                                                                                                                                                                          

代码示例:

   public String reverseWords(String s) {s = s.trim();                                    // 删除首尾空格int j = s.length() - 1, i = j;StringBuilder res = new StringBuilder();while (i >= 0) {while (i >= 0 && s.charAt(i) != ' ') i--;     // 搜索首个空格res.append(s.substring(i + 1, j + 1) + " "); // 添加单词while (i >= 0 && s.charAt(i) == ' ') i--;     // 跳过单词间空格j = i;                                       // j 指向下个单词的尾字符}return res.toString().trim();                    // 转化为字符串并返回}

代码逻辑详解:

  1. 方法内首先对输入的字符串 s 进行了去除首尾空格的操作,使用了 trim() 方法。

  2. 然后,定义了两个变量 ij,它们分别表示当前单词的末尾位置和起始位置,初始值都为字符串末尾的索引值 s.length() - 1

  3. 创建了一个 StringBuilder 对象 res,用于存储反转后的结果。

  4. 进入一个 while 循环,条件是 i >= 0,即当字符串还有字符时持续执行反转操作。

  5. 在循环中,首先判断当前字符是否为空格,如果不是空格则向前移动 i,直到遇到空格为止。这样就找到了一个完整的单词。

  6. 将找到的单词从字符串中提取出来,使用 substring() 方法从索引 i + 1 到索引 j 提取出子字符串,并将其追加到 res 中,同时在末尾添加一个空格,确保单词之间有空格分隔。

  7. 继续向前寻找下一个单词,重复上述步骤,直到遍历完整个字符串。

  8. 最后,使用 res.toString().trim() 将 StringBuilder 对象转换为字符串,并去除首尾空格,返回反转后的结果。

这段代码实现了对输入字符串中的单词顺序进行反转,并且正确处理了单词之间的空格。

leetcode提交记录:

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

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

相关文章

Qt [获取Dump] 使用WindowsAPI实现生成MiniDump文件

说明 客户现场的软件偶发崩溃是程序开发者&#xff0c;比较头疼的事情。如何更快速的定位到问题点和解决掉&#xff0c;是开发应该具备的基本能力。 Windows提供了一系列的API&#xff0c;可以记录软件崩溃前的堆栈信息。下面就实现一个生成Dump文件的程序实例。 主要代码 回…

计算机系列之输入输出、中断、总线、可靠性、操作系统、进程管理、同步互斥

9、输入输出-中断-总线-可靠性 1、输入输出技术、中断 1、内存与接口地址的编址方法&#xff08;了解概念即可&#xff09; 计算机系统中存在多种内存与接口地址的编址方法&#xff0c;常见的是下面两种&#xff1a;&#xff08;了解概念即可&#xff09; 1&#xff09;内存…

ai大模型应用开发

随着人工智能技术的飞速发展&#xff0c;AI大模型应用开发已成为一个日益重要的领域。本文将从专业角度深入探讨AI大模型的应用开发&#xff0c;并思考其未来的深度影响和逻辑性。 编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; ​【一、AI大模型的定义与特点…

ASP.NET Core 3 高级编程(第8版) 学习笔记 03

本篇介绍原书的第 18 章&#xff0c;为 19 章 Restful Service 编写基础代码。本章实现了如下内容&#xff1a; 1&#xff09;使用 Entity Framework Core 操作 Sql Server 数据库 2&#xff09;Entity Framework Core 数据库迁移和使用种子数据的方法 3&#xff09;使用中间件…

Babylon.js 读取GLB模型元数据

如果你熟悉将 3D 资源导出到游戏引擎的过程&#xff0c;那么无疑也会熟悉 3D 资源的 PBR 和 GLB 导出过程。 这是我们之前概述的内容&#xff0c;也是我们交互式工作的所有资产准备的基石。 然而&#xff0c;从传统的管道意义上来说&#xff0c;能够用元数据标记网格有很多逻辑…

通配符HTTPS安全证书

众多类型的SSL证书&#xff0c;要说适用或者说省钱肯定是通配符了&#xff0c;因为谁都想一本SSL证书包括了整条域名&#xff0c;而且也不用一条一条单独管理。 通配符HTTPS安全证书&#xff0c;其实就是通配符SSL证书&#xff0c;SSL证书主流CA的参数都一样&#xff0c;通配符…

武汉星起航:亚马逊助力中国卖家扬帆出海,迎来跨境电商新机遇

2015年&#xff0c;亚马逊全球开店业务正式踏入中国这片充满活力和潜力的市场&#xff0c;此举不仅为中国卖家提供了前所未有的跨境电商新机遇&#xff0c;更为其发展出口业务、拓展全球市场、打造国际品牌铺设了一条坚实的道路。亚马逊作为国际版的电商购物平台&#xff0c;其…

Hadoop-Hive-Spark-离线环境搭建

一、版本描述 apache-hive-2.3.9-bin.tar.gz hadoop-2.7.0.tar.gz spark-2.4.0-bin-hadoop2.7.tgz 下载链接&#xff1a; https://archive.apache.org/dist/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz https://archive.apache.org/dist/hadoop/common/hadoop-2.7.…

vscode 创建代码模版

在vscode中快捷创建代码模版 1.在VSCode中&#xff0c;按下Ctrl Shift P&#xff08;Windows/Linux&#xff09;或Cmd Shift P&#xff08;Mac&#xff09;打开命令面板。 2.然后输入"Preferences: Configure User Snippets"并选择该选项。打开一个json文件用户…

IDEA中配置使用maven和配置maven的中央仓库

1 以汉化后的IDEA为例配置maven 打开idea选择文件 选择 设置 点击>构建.执行.部署 点击>构建工具 点击>Maven 其中Maven主路径 就是我们maven下载解压后的路径 可以通过边上的三个点选择你解压后的绝对路径&#xff0c;也可以直接把解压后的绝对路劲复制过来 以下…

回归预测 | Matlab实现SSA-ESN基于麻雀搜索算法优化回声状态网络的多输入单输出回归预测

回归预测 | Matlab实现SSA-ESN基于麻雀搜索算法优化回声状态网络的多输入单输出回归预测 目录 回归预测 | Matlab实现SSA-ESN基于麻雀搜索算法优化回声状态网络的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-ESN基于麻雀搜索算法…

物联网:从电信物联开发平台AIoT获取物联设备上报数据示例

设备接入到电信AIoT物联平台后&#xff0c;可以在平台上查询到设备上报的数据。 下面就以接入的NBIOT物联远传水表为例。 在产品中选择指定设备&#xff0c;在数据查看中可以看到此设备上报的数据。 示例中这组数据是base64位加密的&#xff0c;获取后还需要转换解密。 而我…

2024 IDM最新破解版及软件介绍

*IDM&#xff1a;信息时代的高效管理工具** 在快节奏的现代社会中&#xff0c;随着信息的爆炸式增长&#xff0c;如何高效、有序地管理信息成为每个人都需要面对的挑战。IDM&#xff0c;作为一种信息管理工具&#xff0c;正在逐渐受到人们的青睐。 IDM&#xff0c;全称Inform…

Linux--进程控制(1)

文章衔接&#xff1a; Linux--环境变量-CSDN博客 Linux--地址空间-CSDN博客 目录 1.进程创建 2.进程的终止 2.1想明白&#xff1a;终止是在做什么&#xff1f; 2.2进程终止的三种情况 2.3 进程如何终止 3.进程等待 &#xff08;wait/waitpid&#xff09; 1.进程创建 在li…

C++内存分布 new和delete介绍

目录 C/C内存分布 栈区 堆区 静态区 常量区 C new和delete 分配空间形式对比 new delete与malloc free的区别 可不可以串着使用new和free呢 C/C内存分布 C的内存分布&#xff0c;大体上分为栈区 堆区 静态区 常量区 栈区 栈区是用于存储函数调用时的局部变量 函…

MySQL——运维

日志 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 查看日志位置&#xff1a; sho…

Eigen::svd和 np.linalg.svd的不同之处

目录 pythonc结论参考 SVD奇异值分解与PCA主成分分析 SVD动画图解–Wiki Eigen Svd 和 np.linalg.svd都可以用于SVD计算&#xff0c;但两者却存在细微的差别。 python import numpy as np datanp.array([[0.99337785, 0.08483806, 0.07747866, -92.91055059],[-0.07889607,…

【Qt常用控件】—— 多元素控件

目录 1.1 List Widget 1.2 Table Widget 1.3 Tree Widget 1.4 小结 Qt 中提供的多元素控件有: QListWidget QListView QTableWidget QTableView QTreeWidget QTreeView xxWidget 和 xxView 之间的区别 以 QTableWidget 和 QTableView 为例&#xff1a; QTableView 是基于…

03-JAVA设计模式-备忘录模式

备忘录模式 什么是备忘录模式 Java中的备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在不破坏封装性的前提下捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便以后可以将对象恢复到原先保存的状态…

Idea:阿里巴巴Java编码插件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、Alibaba Java Coding Guidelines插件介绍 二、使用步骤 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Alibaba Java Coding …