将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反 转为”abfedcg”

简介: 将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反 转为”abfedcg”

将一个字符串进行反。将字符串中指定部分进行反转。比如“abcdefg”反 转为”abfedcg”


题目:将一个字符串进行反转,比如“abcdefg”反 转为”abfedcg” ,指转换指定部分,而不是整个字符串一起反转。

PS:以下讲解了三个方法并且附加详细思路,一个:o:为一个方法


:o::方法一:转换为char[]数组

思想:调用toCharArray()方法转换为会char数组,然后进行需要反转元素的元素首尾互换(参考冒泡排序交换元素的方法),交换完了之后再调用String的构造器转换回String,返回即可

public String reverse(String string,int startIndex,int endIndex){
    if (string!=null){
        char[] c1 = string.toCharArray();//转换为char[]数组
        for (int x = startIndex,y=endIndex;x<y ; x++,y--) {
            char temp=c1[x];
            c1[x]=c1[y];
            c1[y]=temp;
        }
        return new String(c1);
    }
    return null;
}

:o::方法二:使用String的拼接操作

思想:把整体分为三部分,第一部分取出不变,第二部分(需要反转的部分)for反向循环用String的拼接,拼接到第一部分,第三部分直接拼接,拼接完了返回即可

public String reverse1(String string,int startIndex,int endIndex){
    if (string!=null){
        //第一部分
        String s1 = string.substring(0, endIndex);
        //第二部分
        for (int i = endIndex; i >=startIndex ; i--) {
            s1=s1+s1.charAt(i);
        }
        //第三部分
        s1=s1+string.substring(endIndex+1);
        return s1;
    }
    return null;
}

方法三:使用StringBuffer/StringBuilder替换String

代码解释以及注意点

  1. 第二部分用for反向循环来拼接时,比方法二效率高很多,因为StringBuilder具有可变性,都是在原有的字符串进行操作,而String具有不可变性,每次都是新建一个字符串
  2. StringBuilder sb1 = new StringBuilder(string.length());这里之所以没有直接写string,因为一开始就定义了一样的长度,就省去了后面的扩容操作,因为StringBuilder默认是16位,输入长度多了要扩容,详情见参考文章第二个。(并不是每一个客户输入的字符串都像敲代码举例子那样子只输入几个字符串而已)
  3. 要知道substring方法的“左闭右开”原则。详情也看参考文章第二个,有具体讲解substring方法

代码部分

public String reverse3(String string,int startIndex,int endIndex){
    if(string!=null){
        StringBuilder sb1 = new StringBuilder(string.length());
        //1.把String的第一部分转换为StringBuilder类型为s1
        StringBuilder s1 = sb1.append(string.substring(0,startIndex));
        //2.把反转的部分反向循环一个个用String的charAt方法拼接到第一部分(效率更高)
        for (int i = endIndex; i >=startIndex ; i--) {
            s1.append(string.charAt(i));//
        }
        //3.把剩余部分拼接到s1上,至始至终都是在对StringBuilder型s1进行操作,这是因为StringBuilder具有可变性
        s1.append(string.substring(endIndex+1));

        return s1.toString();
    }
    return null;
}
目录
相关文章
|
SQL 存储 JSON
阿里云数据库 SelectDB 内核 Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%
亲爱的社区小伙伴们,Apache Doris 2.1.0 版本已于 2024 年 3 月 8 日正式发布,新版本开箱盲测性能大幅优化,在复杂查询性能方面提升100%,新增Arrow Flight接口加速数据读取千倍,支持半结构化数据类型与分析函数。异步多表物化视图优化查询并助力仓库分层建模。引入自增列、自动分区等存储优化,提升实时写入效率。Workload Group 资源隔离强化及运行时监控功能升级,保障多负载场景下的稳定性。新版本已经上线,欢迎大家下载使用!
1207 1
阿里云数据库 SelectDB 内核 Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%
VS中出现的printf,scanf等函数不安全而报错的问题的全面解决方法
VS中出现的printf,scanf等函数不安全而报错的问题的全面解决方法
1617 0
|
1月前
|
人工智能 安全 云计算
中国银联基于通义千问打造金融支付垂域大模型
中国银联携手阿里云,基于通义千问打造金融支付大模型,依托AI技术推动支付清算、风控反欺诈等环节智能化升级,共建安全高效的大模型应用范式,助力金融行业高质量发展。
287 2
中国银联基于通义千问打造金融支付垂域大模型
|
调度
Magisk模块:Uperf调度模式切换器
Magisk模块:Uperf调度模式切换器
2832 0
|
8月前
|
机器学习/深度学习 存储 缓存
加速LLM大模型推理,KV缓存技术详解与PyTorch实现
大型语言模型(LLM)的推理效率是AI领域的重要挑战。本文聚焦KV缓存技术,通过存储复用注意力机制中的Key和Value张量,减少冗余计算,显著提升推理效率。文章从理论到实践,详细解析KV缓存原理、实现与性能优势,并提供PyTorch代码示例。实验表明,该技术在长序列生成中可将推理时间降低近60%,为大模型优化提供了有效方案。
1601 15
加速LLM大模型推理,KV缓存技术详解与PyTorch实现
|
1月前
|
机器学习/深度学习 供应链 算法
电商图片搜索:技术破局与商业落地,重构“视觉到交易”全链路
图片搜索技术正成为电商核心竞争力,从找货、运营到品牌维权,贯穿全链路提效。本文详解其技术原理与商业落地,揭示如何用“视觉语言”重构电商未来。
|
7月前
|
存储 前端开发 搜索推荐
内容,内容资产,以及内容即服务
内容是指在媒体、平台或者其他载体上所呈现的信息、文章、图片、视频、音频等形式的表达。内容可以是有关某个特定主题或领域的知识、观点、故事、娱乐等,通过文字、图像、声音等方式传达给用户或观众。在互联网时代,内容的重要性越来越突出,各种网站、应用和社交媒体平台都以提供优质内容为目标,吸引用户关注和参与。
388 3
|
9月前
|
算法 数据安全/隐私保护
基于二次规划优化的OFDM系统PAPR抑制算法的matlab仿真
本程序基于二次规划优化的OFDM系统PAPR抑制算法,旨在降低OFDM信号的高峰均功率比(PAPR),以减少射频放大器的非线性失真并提高电源效率。通过MATLAB2022A仿真验证,核心算法通过对原始OFDM信号进行预编码,最小化最大瞬时功率,同时约束信号重构误差,确保数据完整性。完整程序运行后无水印,展示优化后的PAPR性能提升效果。
220 14
|
Python
python在列表、元素、字典、集合和numpy的数组前加上星号 * 是什么含义,以及*args和**kwargs的使用
python在列表、元素、字典、集合和numpy的数组前加上星号 * 是什么含义,以及*args和**kwargs的使用
283 0
|
存储 算法 Java
【DFS(深度优先搜索)详解】看这一篇就够啦
本文介绍了深度优先搜索(DFS)算法及其应用。DFS从某个顶点出发,深入探索图的每条路径,直到无法前进为止,然后回溯。文章详细解释了DFS的基本思想,并通过示例图展示了其执行过程。此外,文中还探讨了三种枚举方式:指数型枚举、排列型枚举和组合型枚举,并提供了具体的代码实现。最后,文章通过几道练习题帮助读者更好地理解和应用DFS算法。
10510 19
【DFS(深度优先搜索)详解】看这一篇就够啦