当前位置: 首页 > news >正文

反转字符串-双指针法,

在 Java 中,使用 双指针法 反转字符串是一种高效且直观的方法。以下是详细的解析和代码实现。


1. 双指针法的核心思想

  • 使用两个指针:一个指向字符串的起始位置(left),另一个指向字符串的末尾位置(right)。

  • 交换 left 和 right 指针所指向的字符。

  • 逐步向中间移动指针,直到 left 和 right 相遇。


2. 实现步骤

  1. 将字符串转换为字符数组

    • 字符串在 Java 中是不可变的,因此需要将其转换为字符数组 char[] 才能修改。

  2. 初始化指针

    • left 指向数组的起始位置(0)。

    • right 指向数组的末尾位置(length - 1)。

  3. 交换字符并移动指针

    • 交换 left 和 right 指针所指向的字符。

    • 将 left 向右移动一位,right 向左移动一位。

  4. 终止条件

    • 当 left >= right 时,反转完成。


3. 代码实现

以下是使用双指针法反转字符串的 Java 代码:

java

复制

public class ReverseString {public static String reverseString(String s) {// 将字符串转换为字符数组char[] chars = s.toCharArray();// 初始化双指针int left = 0;int right = chars.length - 1;// 交换字符并移动指针while (left < right) {// 交换 left 和 right 指向的字符char temp = chars[left];chars[left] = chars[right];chars[right] = temp;// 移动指针left++;right--;}// 将字符数组转换回字符串return new String(chars);}public static void main(String[] args) {String s = "hello";String reversed_s = reverseString(s);System.out.println(reversed_s);  // 输出: olleh}
}

4. 代码解析

4.1 将字符串转换为字符数组

java

复制

char[] chars = s.toCharArray();
  • 字符串在 Java 中是不可变的,因此需要将其转换为字符数组 char[] 才能修改。

4.2 初始化双指针

java

复制

int left = 0;
int right = chars.length - 1;
  • left 指向数组的起始位置(0)。

  • right 指向数组的末尾位置(length - 1)。

4.3 交换字符并移动指针

java

复制

while (left < right) {char temp = chars[left];chars[left] = chars[right];chars[right] = temp;left++;right--;
}
  • 交换 left 和 right 指针所指向的字符。

  • 将 left 向右移动一位,right 向左移动一位。

4.4 将字符数组转换回字符串

java

复制

return new String(chars);
  • 将修改后的字符数组 char[] 转换回字符串。


5. 示例演示

输入字符串

复制

s = "hello"
反转过程
  1. 初始状态

    复制

    chars = ['h', 'e', 'l', 'l', 'o']
    left = 0, right = 4
  2. 第一次循环

    • 交换 chars[0] 和 chars[4]

      复制

      chars = ['o', 'e', 'l', 'l', 'h']
    • 移动指针:

      复制

      left = 1, right = 3
  3. 第二次循环

    • 交换 chars[1] 和 chars[3]

      复制

      chars = ['o', 'l', 'l', 'e', 'h']
    • 移动指针:

      复制

      left = 2, right = 2
  4. 终止条件

    • left >= right,循环结束。

输出结果

复制

reversed_s = "olleh"

6. 复杂度分析

时间复杂度
  • O(n):需要遍历字符串的一半长度(n/2 次交换操作)。

空间复杂度
  • O(n):需要将字符串转换为字符数组。


7. 总结

  • 双指针法是一种高效的反转字符串方法,时间复杂度为 O(n),空间复杂度为 O(n)。

  • 通过交换字符并移动指针,逐步将字符串反转。

  • 代码简洁直观,适合大多数场景。

通过以上解析和代码实现,可以轻松掌握双指针法反转字符串的核心思想和方法!

相关文章:

反转字符串-双指针法,

在 Java 中&#xff0c;使用 双指针法 反转字符串是一种高效且直观的方法。以下是详细的解析和代码实现。 1. 双指针法的核心思想 使用两个指针&#xff1a;一个指向字符串的起始位置&#xff08;left&#xff09;&#xff0c;另一个指向字符串的末尾位置&#xff08;right&…...

亚博microros小车-原生ubuntu支持系列 27、手掌控制小车运动

背景知识 本节跟上一个测试类似&#xff1a;亚博microros小车-原生ubuntu支持系列&#xff1a;26手势控制小车基础运动-CSDN博客 都是基于MediaPipe hands做手掌、手指识别的。 为了方便理解&#xff0c;在贴一下手指关键点分布。手掌位置就是靠第9点来识别的。 2、程序说明…...

STM32 HAL库 CANbus通讯(C语言)

#include "main.h" #include "stm32f1xx_hal.h"CAN_HandleTypeDef hcan; CAN_TxHeaderTypeDef TxHeader; CAN_RxHeaderTypeDef RxHeader; uint8_t TxData[8]; uint8_t RxData[8]; uint32_t TxMailbox;void CAN_Init(void) {// 使能CAN时钟__HAL_RCC_CAN1_C…...

ML.NET库学习005:基于机器学习的客户细分实现与解析

文章目录 ML.NET库学习005&#xff1a;基于机器学习的客户细分实现与解析项目主要目的和原理目的原理 项目概述实现的主要功能主要流程步骤使用的主要函数方法关键技术 主要功能和步骤功能详细解读详细步骤解析 数据集及其处理步骤数据集处理步骤关键处理步骤原理1. 数据清洗与…...

(2/100)每日小游戏平台系列

新增一个猜单词小游戏&#xff01; ------------------------------------------------------------------------------------------------------------------ 猜单词游戏玩法 游戏规则&#xff1a; 游戏会从一个预设的单词列表中随机选择一个单词。玩家有 6 次机会来猜测单…...

【Linux Oracle】杂货铺 日常实用2024

1.跨服务器移动文件 passwd=^T^bxxxx `/usr/bin/expect <<-EOF set timeout -1 spawn scp -r ${BATCH_TIME} sxnhtc@192.168.3.x:${EXP_MCRO_DIR}/ expect "*password:" send "$passwd\r" interact expect eof EOF` curl -k -X GET https://192.16…...

浏览器的缓存方式几种

浏览器的缓存方式主要分为以下几种&#xff1a; 1. 强制缓存&#xff08;强缓存 / Memory Cache & Disk Cache&#xff09; 通过 Expires 或 Cache-Control 头部控制。在缓存有效期内&#xff0c;浏览器直接使用缓存&#xff0c;不发起请求。 关键HTTP头&#xff1a; Ex…...

黑马React保姆级(PPT+笔记)

目录 一、react基础 1.进程 2、优势 3、市场 4、搭建脚手架 认识目录 核心依赖&#xff08;右边两个react&#xff09; 去除非必要 运行原理&#xff1a; 总结 5、JSX 本质 高频场景 注意​编辑 渲染列表 总结 条件渲染 简单情况 复杂情况 事件绑定&#x…...

2025web寒假作业二

一、整体功能概述 该代码构建了一个简单的后台管理系统界面&#xff0c;主要包含左侧导航栏和右侧内容区域。左侧导航栏有 logo、管理员头像、导航菜单和安全退出按钮&#xff1b;右侧内容区域包括页头、用户信息管理内容&#xff08;含搜索框和用户数据表格&#xff09;以及页…...

三、OSG学习笔记-应用基础

前一章节&#xff1a;二、OSG学习笔记-入门开发-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145513874 一、 OsgGA: 界面事件处理空间&#xff0c;处理操作各种操作器的最大名字空间&#xff1b; GUIEventHandler: ui 事件操作类 注意&#xff1a;在启…...

CTFHub-RCE系列wp

目录标题 引言什么是RCE漏洞 eval执行文件包含文件包含php://input读取源代码远程包含 命令注入无过滤过滤cat过滤空格过滤目录分隔符过滤运算符综合过滤练习 引言 题目共有如下类型 什么是RCE漏洞 RCE漏洞&#xff0c;全称是Remote Code Execution漏洞&#xff0c;翻译成中文…...

Linux ping不通百度但浏览器可以打开百度的的解决方法

问题描述&#xff1a;使用ping命令ping www.baidu.com,提示的地址为ipv6地址&#xff0c;但该地址ping不通&#xff0c;但使用浏览器直接打开百度网址可以打开。 问题可能的原因&#xff1a;&#xff08;1&#xff09;虚拟机上ipv6为自动模式&#xff0c;影响了ipv4寻址&#…...

Redis中的某一热点数据缓存过期了,此时有大量请求访问怎么办?

1、提前设置热点数据永不过期 2、分布式中用redis分布式锁&#xff08;锁可以在多个 JVM 实例之间协调&#xff09;、单体中用synchronized&#xff08;锁只在同一个 JVM 内有效&#xff09; 编写服务类 import com.redisson.api.RLock; import com.redisson.api.RedissonCli…...

低成本+高性能+超灵活!Deepseek 671B+Milvus重新定义知识库搭建

“老板说&#xff0c;这个项目得上Deepseek,还得再做个知识库...” 还有哪个开发者&#xff0c;最近没听到这样的抱怨&#xff1f; Deepseek爆火&#xff0c;推理端的智能提速&#xff0c;算力成本急剧下降&#xff0c;让不少原本不想用大模型&#xff0c;用不起大模型的企业&a…...

TCP服务器与客户端搭建

一、思维导图 二、给代码添加链表 【server.c】 #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <fcntl.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.…...

PDF 文件的安全功能概述

由于安全问题始终存在&#xff0c;我们希望重点介绍 PDF 文件格式提供的一些安全功能。如果您希望控制或限制用户可以执行的操作&#xff0c;这些功能可以启用。本文将介绍可以阻止哪些类型的操作&#xff0c;以及可以实施哪些不同的身份验证技术来提高 PDF 的安全性。 可以控制…...

在Linux上部署Jenkins的详细指南

引言 在当今快速迭代的软件开发环境中&#xff0c;持续集成和持续交付&#xff08;CI/CD&#xff09;变得越来越重要。Jenkins作为一个开源自动化服务器&#xff0c;能够帮助开发者更高效地进行代码集成、测试和部署。本文将详细介绍如何在Linux系统上安装和配置Jenkins。 准…...

碳纤维复合材料制造的六西格玛管理实践:破解高端制造良率困局的实战密码

碳纤维复合材料制造的六西格玛管理实践&#xff1a;破解高端制造良率困局的实战密码 在全球碳中和与高端制造升级的双重驱动下&#xff0c;碳纤维复合材料行业正经历前爆发式增长。航空航天、新能源汽车、风电叶片等领域对碳纤维产品的性能稳定性提出近乎苛刻的要求&#xff0…...

Day83:图形的绘制

Python 提供了多种绘图工具,其中最常用的是 Turtle(海龟绘图)和 Matplotlib(数据可视化)。今天,我们主要介绍 Turtle,它可以轻松绘制各种几何图形、艺术图案和动画。 1. Turtle 库简介 Turtle 是 Python 内置的绘图工具,主要用于教学、趣味绘画和简单图形的创建。 基…...

C# Dll嵌入到.exe

将dll属性作为 嵌入的资源 修改引用属性为不复制 增加dll识别来源 AppDomain.CurrentDomain.AssemblyResolve new ResolveEventHandler(CurrentDomain_AssemblyResolve);private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, Reso…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...