代码随想录算法训练营第八天|Leetcode 151.翻转字符串里的单词 卡码网:55.右旋转字符串 字符串总结 双指针回顾

151.翻转字符串里的单词

建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。

题目链接/文章讲解/视频讲解:代码随想录

我们这道题的思路是,先将整个字符串反转,结束之后再定位每一个单词,然后再将单词进行反转,思路为什么是这样子的呢

为什么要先翻转整个字符集,再翻转单词,而不是直接翻转单词

假设输入字符串: "hello world"

方法1 (当前代码采用的方法):
1. 整体翻转: "dlrow olleh"
2. 单词翻转: "world hello"

方法2 (直接翻转单词):
这需要:
1. 找到每个单词的位置
2. 将单词存储到新的位置
3. 处理单词之间的空格
4. 可能需要额外的存储空间来临时保存单词

当前方法的优势:
1. 空间复杂度低:只需要在原字符串上操作,不需要额外空间存储单词
2. 实现简单:只需要简单的字符交换操作
3. 时间复杂度稳定:只需要遍历字符串固定的次数

直接翻转单词的劣势:
1. 需要额外的空间来存储单词
2. 需要处理单词移动的复杂逻辑
3. 实现起来更复杂,容易出错

 

如果我们直接对单词进行反转,我举个例子

“hello world”

反转之后应该是“world hello”

如果不将字符串先进行反转,我们直接反转的话,需要额外的空间,因为数组的操作从根本上来说是覆盖操作,那么我们在写world的时候就会将hello覆盖,所以我们需要格外的空间存储hello才行,这样就把逻辑变复杂了,如果先翻转再单词内部反转,适度简化了逻辑。

我们来看代码

public String reverseWords(String s) {// 第一步:调用removeSpace去除多余空格StringBuilder sb = removeSpace(s);// 第二步:反转整个字符串reverseString(sb, 0, sb.length() - 1);// 第三步:反转每个单词reverseEachWord(sb);// 返回最终结果return sb.toString();
}
private StringBuilder removeSpace(String s) {// 定义双指针,用于确定字符串的有效范围(去除首尾空格)int start = 0;int end = s.length() - 1;// 移动start指针,跳过开头的空格while (s.charAt(start) == ' ') start++;// 移动end指针,跳过结尾的空格while (s.charAt(end) == ' ') end--;// 创建StringBuilder存储结果StringBuilder sb = new StringBuilder();// 处理中间的空格,确保单词之间只有一个空格while (start <= end) {char c = s.charAt(start);// 当前字符不是空格,或者当前字符是空格但前一个字符不是空格时,才添加if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {sb.append(c);}start++;}return sb;
}
public void reverseString(StringBuilder sb, int start, int end) {// 使用双指针从两端向中间移动while (start < end) {// 交换start和end位置的字符char temp = sb.charAt(start);sb.setCharAt(start, sb.charAt(end));sb.setCharAt(end, temp);// 移动指针start++;end--;}
}
private void reverseEachWord(StringBuilder sb) {// start指向单词的开始,end指向下一个字符int start = 0;int end = 1;int n = sb.length();while (start < n) {// 移动end直到找到单词的结束位置(空格或字符串末尾)while (end < n && sb.charAt(end) != ' ') {end++;}// 反转当前单词reverseString(sb, start, end - 1);// 更新start和end,准备处理下一个单词start = end + 1;end = start + 1;}
}

卡码网:55.右旋转字符串

建议:题解中的解法如果没接触过的话,应该会想不到

题目链接/文章讲解:

右旋转

 我们思路和之前一样,先整体反转,然后反转前n个字符,再反转剩余字符,为什么这样做呢,因为可以

1. 空间复杂度O(1):只需要在原数组上操作
2. 实现简单:只需要基本的反转操作
3. 适用性强:对任意长度的字符串和任意的n值都适用
4. 不需要考虑字符移动和临时存储的复杂问题

我们来看代码:

public static void main(String[] args) {// 读取输入Scanner in = new Scanner(System.in);// 读取n值,表示第一部分的长度int n = Integer.parseInt(in.nextLine());// 读取待处理的字符串String s = in.nextLine();int len = s.length();// 将字符串转换为字符数组,方便操作char[] chars = s.toCharArray();// 三步反转法reverseString(chars, 0, len - 1);     // 步骤1:整体反转reverseString(chars, 0, n - 1);       // 步骤2:反转前n个字符reverseString(chars, n, len - 1);     // 步骤3:反转剩余字符// 输出结果System.out.println(chars);
}

public static void reverseString(char[] ch, int start, int end) {// 使用异或运算进行字符交换while (start < end) {// 三步异或操作实现两个字符的交换ch[start] ^= ch[end];    // a = a^bch[end] ^= ch[start];    // b = b^(a^b) = ach[start] ^= ch[end];    // a = (a^b)^a = bstart++;end--;}
}

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

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

相关文章

【计算机网络】计算机网络的性能指标——时延、时延带宽积、往返时延、信道利用率

计算机网络的性能指标 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 在上一篇内容中我们介绍了计算机网络的三个性能指标——速率、带宽和吞吐量。用大白话来说就是&#xff1a;网速、最高网速和实时网速。 相信大家看到这三个词应该就…

Refreshtoken 前端 安全 前端安全方面

网络安全 前端不需要过硬的网络安全方面的知识,但是能够了解大多数的网络安全,并且可以进行简单的防御前两三个是需要的 介绍一下常见的安全问题,解决方式,和小的Demo,希望大家喜欢 网络安全汇总 XSSCSRF点击劫持SQL注入OS注入请求劫持DDOS 在我看来,前端可以了解并且防御前…

vue3框架的响应式依赖追踪机制

当存在一个响应式变量于视图中发生改变时会更新当前组件的所以视图显示&#xff0c;但是没有视图中不写这个响应式变量就就算修改该变量也不会修改视图&#xff0c;这是为什么&#xff1f;我们能否可以理解宽泛的理解为vue组件的更新就是视图的更新&#xff0c;单当视图中不存在…

C#核心(22)string

前言 我们在之前的学习中已经学习过了很多数字类型的数据结构,但一直没有讲解除了char以外的字符串相关的知识点,这也是我们继继承,封装,重载这些知识点之后要补充讲解的核心知识点。 你也发现了,其实在密封函数之后我们就已经开始进入更底层的方面为你讲解知识点了,这…

Spring Boot 本地缓存工具类设计与实现

在 Spring Boot 应用中&#xff0c;缓存是提升性能的重要手段之一。为了更方便地使用缓存&#xff0c;我们可以设计一套通用的本地缓存工具类&#xff0c;封装常见的缓存操作&#xff0c;简化开发流程。本文将详细介绍如何设计并实现一套 Spring Boot 本地缓存工具类&#xff0…

引领变革!北京爱悦诗科技有限公司荣获“GAS消费电子科创奖-产品创新奖”!

在2025年“GAS消费电子科创奖”评选中&#xff0c;北京爱悦诗科技有限公司提交的“aigo爱国者GS06”&#xff0c;在技术创新性、设计创新性、工艺创新性、智能化创新性及原创性五大维度均获得评委的高度认可&#xff0c;荣获“产品创新奖”。 这一奖项不仅是对爱悦诗在消费电子…

考研英语语法全攻略:从基础到长难句剖析​

引言 在考研英语的备考之旅中,语法犹如一座灯塔,为我们在浩瀚的英语知识海洋中指引方向。无论是阅读理解中复杂长难句的解读,还是写作时准确流畅表达的需求,扎实的语法基础都起着至关重要的作用。本文将结合有道考研语法基础入门课的相关内容,为大家全面梳理考研英语语法…

构建自己的AI客服【根据用户输入生成EL表达式】

要实现一个基于对话形式的AI客服系统&#xff0c;该系统能够提示用户输入必要的信息&#xff0c;并根据用户的输入生成相应的EL&#xff08;Expression Language&#xff09;表达式编排规则&#xff0c;您可以按照以下步骤进行设计和开发。本文将涵盖系统架构设计、关键技术选型…

【JavaWeb12】数据交换与异步请求:JSON与Ajax的绝妙搭配是否塑造了Web的交互革命?

文章目录 &#x1f30d;一. 数据交换--JSON❄️1. JSON介绍❄️2. JSON 快速入门❄️3. JSON 对象和字符串对象转换❄️4. JSON 在 java 中使用❄️5. 代码演示 &#x1f30d;二. 异步请求--Ajax❄️1. 基本介绍❄️2. JavaScript 原生 Ajax 请求❄️3. JQuery 的 Ajax 请求 &a…

解决CentOS 8.5被恶意扫描的问题

CentOS 8 官方仓库已停止维护(EOL),导致一些常用依赖包如fail2ban 无法正常安装。 完整解决方案: 一、问题根源 CentOS 8 官方仓库已停更:2021 年底 CentOS 8 停止维护,默认仓库的包可能无法满足依赖关系。EPEL 仓库兼容性:EPEL 仓库可能未适配 CentOS 8.5 的旧版本依赖…

使用格式工厂提取视频中的音频

选择输出格式&#xff1a;在格式工厂的左侧功能栏中&#xff0c;点击 “音频” 选项&#xff0c;会展开多种音频格式&#xff0c;根据自己的需求选择如 “MP3”“WAV”“WMA” 等作为输出格式。添加视频文件&#xff1a;点击 “添加文件” 按钮&#xff0c;在弹出的文件浏览器中…

前端杂的学习笔记

什么是nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 Nginx是一款轻量级的Web 服务器/反向代理服务器&#xff0c;处理高并发能力是十分强大的&#xff0c;并且支持热部署&#xff0c;启动简单&#xff0c;可以做到7*24不间断运行 正代和反代 学习nginx&a…

玩转ChatGPT:GPT 深入研究功能

一、写在前面 民间总结&#xff1a; 理科看Claude 3.7 Sonnet 文科看DeepSeek-R1 那么&#xff0c;ChatGPT呢&#xff1f; 看Deep Research&#xff08;深入研究&#xff09;功能。 对于科研狗来说&#xff0c;在这个文章爆炸的时代&#xff0c;如何利用AI准确、高效地收…

RabbitMQ 2025/3/5

高性能异步通信组件。 同步调用 以支付为例&#xff1a; 可见容易发生雪崩。 异步调用 以支付为例&#xff1a; 支付服务当甩手掌柜了&#xff0c;不管后面的几个服务的结果。只管库库发&#xff0c;后面那几个服务想取的时候就取&#xff0c;因为消息代理里可以一直装&#x…

Win10 访问 Ubuntu 18 硬盘

目录 方案一&#xff1a;使用Samba共享服务Ubuntu 18 端配置Windows 10 端访问 方案二&#xff1a;使用 SSHFS&#xff08;需在 Windows 上安装 SSH 客户端&#xff09;Ubuntu 18 端配置Windows 10 端配置 方案三&#xff1a;使用 FTP 服务Ubuntu 18 端配置Windows 10 端访问 方…

Android15使用FFmpeg解码并播放MP4视频完整示例

效果: 1.编译FFmpeg库: 下载FFmpeg-kit的源码并编译生成安装平台库 2.复制生成的FFmpeg库so文件与包含目录到自己的Android下 如果没有prebuiltLibs目录,创建一个,然后复制 包含目录只复制arm64-v8a下

Hadoop、Hive、Spark的关系

Part1&#xff1a;Hadoop、Hive、Spark关系概览 1、MapReduce on Hadoop 和spark都是数据计算框架&#xff0c;一般认为spark的速度比MR快2-3倍。 2、mapreduce是数据计算的过程&#xff0c;map将一个任务分成多个小任务&#xff0c;reduce的部分将结果汇总之后返回。 3、HIv…

计算机网络篇:基础知识总结与基于长期主义的内容更新

基础知识总结 和 MySQL 类似&#xff0c;我同样花了一周左右的时间根据 csview 对计算机网络部分的八股文进行了整理&#xff0c;主要的内容包括&#xff1a;概述、TCP 与 UDP、IP、HTTP&#xff0c;其中我个人认为最重要的是 TCP 这部分的内容。 在此做一篇目录索引&#xf…

[密码学实战]Java实现国密TLSv1.3单向认证

一、代码运行结果 1.1 运行环境 1.2 运行结果 1.3 项目架构 二、TLS 协议基础与国密背景 2.1 TLS 协议的核心作用 TLS(Transport Layer Security) 是保障网络通信安全的加密协议,位于 TCP/IP 协议栈的应用层和传输层之间,提供: • 数据机密性:通过对称加密算法(如 AE…

09 HarmonyOS NEXT 仿uv-ui Tag组件开发教程系列(三)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 文章目录 Tag组件实战应用与最佳实践1. 复杂场景应用1.1 标签筛选系统 2. 性能优化实践2.1 状态管理优化2.2 渲染性能优化 3. 实用功能扩展3.1 拖拽…