JAVA多种方法实现字符串反转

 更新时间:2022年01月10日 10:42:47   作者:小秋Kaito  
大家好,本篇文章主要讲的是JAVA多种方法实现字符串反转,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

本人自己思考+网络搜罗,分类整理了以下4类9种方法:

A类:使用JAVA原生方法

-A1:使用StringBuffer的reverse方法

-A2:使用StringBuilder的reverse方法

B类:遍历字符串(字符数组)实现

-B1:将字符串转变为字符数组,遍历该数组的一半,依次将头尾开始对应的字符交换

-B2:逆向遍历s,正序拼接出一个新的字符串

-B3:正向遍历s,将取出的字符拼接形成中间字符串,将中间字符串拼接在下一个字符的后面

-B4:从首位两边同时遍历,交换首位下标位置的字符(类似于B1)

C类:递归实现

-C1:将字符串二分后前后交换,递归结束条件为字符串长度小于等于1

-C2:思路同B3,结束条件是长度为1

D类:其他实现

-D1:利用栈stack先进后出的原理实现

有些方法有重复和相似的地方,以后如果搜集到不太相同的思路和解法,该帖我还会继续维护~欢迎收藏。如果各位有新的思路也欢迎交流,如果本人有写错的地方也欢迎指出。

最后补上代码和测试。

package cn.daycode.leetcode;
 
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Stack;
 
public class Reverses {
    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
        Method[] methods = Reverses.class.getDeclaredMethods();
        String s1 = "thgir";
        String s2 = "aabbcc";
        int i = 1;
        System.out.println("测试字符串为:"+s1+","+s2);
        // 反射取出Reverses类中所有名字带reverse的方法,并依次调用
        for (Method m : methods){
            if (m.getName().contains("reverse")){
                System.out.print(i+++".");
                System.out.print("调用了"+m.getName()+"方法,");
                System.out.print("逆序后的结果为:"+m.invoke(new Reverses(),s1));
                System.out.println(","+m.invoke(new Reverses(),s2));
            }
        }
    }
 
    // 方法A1:使用StringBuffer的reverse方法
    private static String reverseA1(String s){
        return new StringBuffer(s).reverse().toString();
    }
 
    // 方法A2:使用StringBuilder的reverse方法
    private static String reverseA2(String s){
        return new StringBuilder(s).reverse().toString();
    }
 
    // 方法B1:将字符串转变为字符数组,遍历数组的一半,将头尾开始对应的字符交换
    private static String reverseB1(String s){
        char[] chars = s.toCharArray();
        int length = chars.length-1;
 
        for (int i = 0; i <= length/2; i++) {
            if(chars[i] != chars[length - i]) {
                chars[i] = (char) (chars[i] ^ chars[length - i]);
                chars[length - i] = (char) (chars[i] ^ chars[length - i]);
                chars[i] = (char) (chars[i] ^ chars[length - i]);
            }
        }
 
        return String.valueOf(chars);
    }
 
    // 方法B2:逆向遍历s,正序拼接出一个新的字符串
    private static String reverseB2(String s){
        StringBuffer sb = new StringBuffer("");
 
        for (int i = s.length()-1; i >= 0 ; i--) {
            sb.append(s.charAt(i));
        }
 
        return sb.toString();
    }
 
    // 方法B3:正向遍历s,将取出的字符拼接形成中间字符串,将中间字符串拼接在下一个字符的后面
    private static String reverseB3(String s){
        String str = "";
 
        for (int i = 0; i < s.length() ; i++) {
            str = s.charAt(i) + str;
        }
 
        return str;
    }
 
    // 方法C1:递归,将字符串二分后前后交换,递归结束条件为字符串长度小于等于1
    private static String reverseC1(String s){
        if(s.length() <= 1){
            return s;
        }
        String l = s.substring(0, s.length()/2);
        String r = s.substring(s.length()/2, s.length());
        return reverseC1(r)+reverseC1(l);
    }
 
    // 方法C2:递归,思路同B3,结束条件是长度为1
    private static String reverseC2(String s){
        if (s.length() <= 1){
            return s;
        }
        return  reverseC2(s.substring(1))+s.charAt(0);
    }
 
    // 方法D1:利用栈stack先进后出的原理实现
    private static String reverseD1(String s){
        char[] str = s.toCharArray();
        Stack<Character> stack = new Stack<Character>();
        for (int i = 0; i < str.length; i++)
            stack.push(str[i]);
 
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < str.length; i++)
            sb.append(stack.pop());
 
        return sb.toString();
    }
 
    // 方法B4:从首位两边同时遍历,交换首位下标位置的字符
    private static String reverseB4(String s){
        char[] chars = s.toCharArray();
        int start = 0;
        int end = chars.length-1;
 
        while (start < end){
            if(chars[start] != chars[end]) {
                chars[start] = (char) (chars[start] ^ chars[end]);
                chars[end] = (char) (chars[start] ^ chars[end]);
                chars[start] = (char) (chars[start] ^ chars[end]);
            }
            start++;
            end--;
        }
 
        return String.valueOf(chars);
    }
 
}

到此这篇关于JAVA多种方法实现字符串反转的文章就介绍到这了,更多相关JAVA字符串反转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 图解Java排序算法之希尔排序

    图解Java排序算法之希尔排序

    这篇文章主要为大家详细介绍了Java排序算法之希尔排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java实现赫夫曼树(哈夫曼树)的创建

    Java实现赫夫曼树(哈夫曼树)的创建

    给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度(WPL)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。这篇文章主要就是为大家介绍如何通过Java实现赫夫曼树,需要的朋友可以参考一下
    2021-12-12
  • java使用Base64实现文件加密解密

    java使用Base64实现文件加密解密

    这篇文章主要为大家详细介绍了java实现Base64给文件加密、解密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • 关于SpringBoot配置文件application.properties的路径问题

    关于SpringBoot配置文件application.properties的路径问题

    这篇文章主要介绍了关于SpringBoot配置文件application.properties的路径问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • SpringBoot+RabbitMQ实现消息可靠传输详解

    SpringBoot+RabbitMQ实现消息可靠传输详解

    消息的可靠传输是面试必问的问题之一,保证消息的可靠传输主要在生产端开启 comfirm 模式,RabbitMQ 开启持久化,消费端关闭自动 ack 模式。本文将详解SpringBoot整合RabbitMQ如何实现消息可靠传输,需要的可以参考一下
    2022-05-05
  • Java统计英文句子中出现次数最多的单词并计算出现次数的方法

    Java统计英文句子中出现次数最多的单词并计算出现次数的方法

    这篇文章主要介绍了Java统计英文句子中出现次数最多的单词并计算出现次数的方法,涉及java针对英文句子的字符串遍历、转换、正则替换、计算等相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • 剑指Offer之Java算法习题精讲二叉搜索树与数组查找

    剑指Offer之Java算法习题精讲二叉搜索树与数组查找

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • swing jtextArea滚动条和文字缩放效果

    swing jtextArea滚动条和文字缩放效果

    这篇文章主要为大家详细介绍了swing jtextArea滚动条和文字缩放效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • java中处理json各种各样的转换方法(推荐)

    java中处理json各种各样的转换方法(推荐)

    下面小编就为大家分享一篇java中处理json各种各样的转换方法小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • Java中检查字符串是否以特定字符结尾

    Java中检查字符串是否以特定字符结尾

    这篇文章主要介绍了Java中检查字符串是否以特定字符结尾,文章围绕主题展开字符串匹配问题,具有一定的参考价值需要的小伙伴可以参考一下
    2022-06-06

最新评论