百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

实现字符串的反转。如:abcd 输出dcba

liebian365 2025-03-28 18:16 11 浏览 0 评论

public class StringReverse {

    // 方法1: 使用 StringBuilder 的 reverse() 方法 (推荐,高效简洁)
    public static String reverseStringStringBuilder(String str) {
        if (str == null) {
            return null; // 处理 null 输入
        }
        return new StringBuilder(str).reverse().toString();
    }

    // 方法2: 迭代方式 (更易理解,但效率略低于 StringBuilder)
    public static String reverseStringIterative(String str) {
        if (str == null) {
            return null; // 处理 null 输入
        }
        String reversedStr = ""; // 初始化空字符串用于存储反转后的字符串
        for (int i = str.length() - 1; i >= 0; i--) {
            reversedStr += str.charAt(i); // 从后向前遍历,逐个字符添加到新字符串
        }
        return reversedStr;
    }

    // 方法3: 使用字符数组 (思路类似迭代,但操作字符数组)
    public static String reverseStringCharArray(String str) {
        if (str == null) {
            return null; // 处理 null 输入
        }
        char[] charArray = str.toCharArray(); // 将字符串转换为字符数组
        int left = 0;
        int right = charArray.length - 1;
        while (left < right) {
            // 交换左右指针指向的字符
            char temp = charArray[left];
            charArray[left] = charArray[right];
            charArray[right] = temp;
            left++;
            right--;
        }
        return new String(charArray); // 将字符数组转换为字符串
    }

    public static void main(String[] args) {
        String inputString = "abcd";
        String reversedString1 = reverseStringStringBuilder(inputString);
        String reversedString2 = reverseStringIterative(inputString);
        String reversedString3 = reverseStringCharArray(inputString);

        System.out.println("原始字符串: " + inputString);
        System.out.println("使用 StringBuilder 反转: " + reversedString1); // 输出: dcba
        System.out.println("迭代方式反转: " + reversedString2);       // 输出: dcba
        System.out.println("字符数组方式反转: " + reversedString3);     // 输出: dcba

        String emptyString = "";
        System.out.println("\n原始字符串 (空字符串): " + emptyString);
        System.out.println("使用 StringBuilder 反转: " + reverseStringStringBuilder(emptyString)); // 输出: (空字符串)

        String nullString = null;
        System.out.println("\n原始字符串 (null): " + nullString);
        System.out.println("使用 StringBuilder 反转: " + reverseStringStringBuilder(nullString));   // 输出: null
    }
}

代码解释和方法比较:

1.
reverseStringStringBuilder(String str) (推荐方法):

  • 原理: 利用 StringBuilder 类提供的 reverse() 方法。StringBuilder 是可变的字符串,reverse() 方法直接在 StringBuilder 对象上进行反转操作,效率很高。
  • 步骤:if (str == null) { return null; }: 首先处理 null 输入,如果输入字符串为 null,则直接返回 null,避免 NullPointerException。new StringBuilder(str): 创建一个新的 StringBuilder 对象,并将输入的字符串 str 作为初始内容。.reverse(): 调用 StringBuilder 对象的 reverse() 方法,该方法会直接反转 StringBuilder 对象内部的字符序列。.toString(): 将反转后的 StringBuilder 对象转换回 String 对象,并返回。
  • 优点: 最简洁、最有效率 的方法。StringBuilder 的 reverse() 方法是专门为字符串反转设计的,性能最佳。
  • 缺点: 代码相对较少,可能不太直观地展示反转的逻辑过程。

2. reverseStringIterative(String str) (迭代方式):

  • 原理: 通过循环从字符串的末尾开始向前遍历,逐个字符添加到新的字符串中,从而实现反转。
  • 步骤:if (str == null) { return null; }: 处理 null 输入。String reversedStr = "";: 初始化一个空字符串 reversedStr,用于存储反转后的字符串。for (int i = str.length() - 1; i >= 0; i--) { ... }: 使用 for 循环,从字符串 str 的最后一个字符 (索引 str.length() - 1) 遍历到第一个字符 (索引 0)。reversedStr += str.charAt(i);: 在循环中,使用 str.charAt(i) 获取当前索引 i 处的字符,并使用 += 运算符将其追加到 reversedStr 的末尾。 注意: 在循环中使用 += 运算符拼接 String 在性能上不如 StringBuilder,因为每次 += 都会创建一个新的 String 对象。这里为了代码的易理解性使用了 String 拼接。return reversedStr;: 循环结束后,reversedStr 就包含了反转后的字符串,将其返回。
  • 优点: 代码逻辑清晰易懂,直接展示了字符串反转的迭代过程。
  • 缺点: 效率相对较低,尤其是在处理长字符串时,由于 String 的不可变性,每次 += 操作都会创建新的 String 对象,导致性能开销较大。

3. reverseStringCharArray(String str) (字符数组方式):

  • 原理: 将字符串转换为字符数组,然后使用双指针(左右指针)从数组两端向中间交换字符,实现数组的反转,最后将反转后的字符数组转换回字符串。
  • 步骤:if (str == null) { return null; }: 处理 null 输入。char[] charArray = str.toCharArray();: 使用 str.toCharArray() 将输入字符串 str 转换为字符数组 charArray。int left = 0; int right = charArray.length - 1;: 初始化左右指针 left 和 right,分别指向字符数组的起始和末尾位置。while (left < right) { ... }: 使用 while 循环,当左指针 left 小于右指针 right 时,循环继续。交换字符:
  • java复制代码
  • char temp = charArray[left]; charArray[left] = charArray[right]; charArray[right] = temp; 在循环中,交换 charArray[left] 和 charArray[right] 的值,实现字符交换。
  • 移动指针:
  • java复制代码
  • left++; right--; 将左指针 left 向右移动一位,将右指针 right 向左移动一位,逐步向数组中心靠近。
  • return new String(charArray);: 循环结束后,字符数组 charArray 就被反转了,使用 new String(charArray) 将字符数组转换为 String 对象并返回。
  • 优点: 思路清晰,使用了常见的双指针交换方法,展示了数组反转的逻辑。 效率比迭代拼接字符串的方式高,因为直接操作字符数组,避免了 String 的频繁创建。
  • 缺点: 代码相对 StringBuilder 方式稍显复杂。

性能比较:

  • StringBuilder.reverse() (方法1): 性能最佳,时间复杂度为 O(n),且 StringBuilder 内部操作效率高。
  • 字符数组方式 (方法3): 性能次之,时间复杂度也为 O(n),直接操作字符数组比 String 拼接效率高。
  • 迭代方式 (方法2): 性能相对较差,尤其是在处理长字符串时,由于 String 的不可变性,每次 += 操作都会创建新的 String 对象,时间复杂度接近 O(n^2) 在某些情况下。

推荐使用
reverseStringStringBuilder(String str) 方法,因为它最简洁、高效,并且是 Java 官方推荐的反转字符串的方式。
如果更注重代码的易理解性,或者需要展示字符串反转的逻辑过程,可以选择迭代方式或字符数组方式。

相关推荐

“版本末期”了?下周平衡补丁!国服最强5套牌!上分首选

明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...

VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符&quot;

首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...

东营交警实名曝光一批酒驾人员名单 88人受处罚

齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...

Qt界面——搭配QCustomPlot(qt platform)

这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...

大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写

老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...

测试谷歌VS Code AI 编程插件 Gemini Code Assist

用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...

顾爷想知道第4.5期 国服便利性到底需优化啥?

前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...

掌握Visual Studio项目配置【基础篇】

1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...

还嫌LED驱动设计套路深?那就来看看这篇文章吧

随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...

Visual Studio Community 2022(VS2022)安装图文方法

直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...

Qt添加MSVC构建套件的方法(qt添加c++11)

前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...

Qt为什么站稳c++GUI的top1(qt c)

为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...

qt开发IDE应该选择VS还是qt creator

如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...

Qt 5.14.2超详细安装教程,不会来打我

Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...

Cygwin配置与使用(四)——VI字体和颜色的配置

简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...

取消回复欢迎 发表评论: