算法(3)Java实现将字符串中指定部分进行反转

给定一个字符串,将字符串中指定部分进行反转。
例如:将 “helloabcdworld” 反转为 “hellodcbaworld”

不管在学习还是工作中,都会遇到操作字符串的问题,官方API里面给出了它的很多方法,只要对这些方法熟练于心,就很容易实现操作字符串。关于字符串的常用方法在此不详细介绍,参考官方文档,在以后的博客中我也会总结Java中String、StringBuilder、StringBuffer的常用方法。

这篇博客提供了三种方式实现字符串的反转操作

1 方式一: 将字符串转化为char[ ]

public class StringReverse {
    public static void main(String[] args) {
        String str = "helloabcdworld";
        // 反转字符串开始位置的下标
        int start = 5;
        // 反转字符串结束位置的下标
        int end = 8;
        System.out.println("原先的字符串: "+str);
        String strNew=strReverse(str, start, end);
        System.out.println("指定部分进行反转后的字符串: "+strNew);
    }

    /**
     *
     * @param str 原先的字符串
     * @param start 反转字符串开始位置的下标
     * @param end 反转字符串结束位置的下标
     * @return 返回反转后的字符串
     */
    private static String strReverse(String str, int start, int end) {
        if (str != null) {
            // 将此字符串转换为新的字符数组
            char[] charArray = str.toCharArray();
            // 利用循环的方式交换位置
            for (int i = start, j = end; i < j; i++, j--) {
                char temp = charArray[i];
                charArray[i] = charArray[j];
                charArray[j] = temp;
            }
            // 将字符数组转换为字符串
            String s = String.valueOf(charArray);  // String s = new String(charArray)
            return s;
        }
        return null;
    }
}

代码执行结果:

原先的字符串: helloabcdworld
指定部分进行反转后的字符串: hellodcbaworld

2 方式二: 使用String拼接的方式

public class StringReverse1 {
    public static void main(String[] args) {
        String str = "helloabcdworld";
        // 开始位置的下标
        int start = 5;
        // 结束位置的下标
        int end = 8;
        System.out.println("原先的字符串: "+str);
        String strNew=strReverse(str, start, end);
        System.out.println("指定部分进行反转后的字符串: "+strNew);
    }

    /**
     *
     * @param str 原先的字符串
     * @param start 反转字符串开始位置的下标
     * @param end 反转字符串结束位置的下标
     * @return 返回反转后的字符串
     */
    private static String strReverse(String str, int start, int end) {
        // 把字符串从头到要反转的位置的字符串截取出来
        // 在此测试代码中,需要反转abcd.  start=5,因此截取的是hello
        String strNew = str.substring(0, start);
        // 利用循环的方式从end位置开始遍历取值,追加到截取的子串后面
        for (int i = end; i >= start; i--) {
            // charAt() 获取指定位置的值
            strNew += str.charAt(i);
        }
        // substring() 截取子串,追加到strNew后面
        strNew += str.substring(end + 1);
        return strNew;
    }
}

在此不再展示测试结果,结果和第一种方式一样。

3 方式三: 使用StringBuilder/StringBuffer

public class StringReverse2 {
    public static void main(String[] args) {
        String str = "helloabcdworld";
        // 开始位置的下标
        int start = 5;
        // 结束位置的下标
        int end = 8;
        System.out.println("原先的字符串: "+str);
        String strNew=strReverse(str, start, end);
        System.out.println("指定部分进行反转后的字符串: "+strNew);
    }

    /**
     *
     * @param str 原先的字符串
     * @param start 反转字符串开始位置的下标
     * @param end 反转字符串结束位置的下标
     * @return 返回反转后的字符串
     */
    private static String strReverse(String str, int start, int end) {
        // 构造一个容量为str.length的字符串构建器
        StringBuilder stringBuilder = new StringBuilder(str.length());
        // 添加[0,start) 的字符串
        stringBuilder.append(str.substring(0, start));
        // 利用循环的方式从end位置开始遍历取值,追加到stringBuilder后面
        for (int i = end; i >= start; i--) {
            stringBuilder.append(str.charAt(i));
        }
        // substring() 截取子串,并追加到stringBuilder后面
        String  substring = str.substring(end + 1);
        stringBuilder.append(substring);
        // toString() 返回表示此顺序中的数据的字符串
        return stringBuilder.toString();
    }
}

在此不再展示测试结果,结果和第一种方式一样。

在反转操作中,由于不需要考虑多线程安全的问题,优先采用StringBuilder,StringBuilder 和StringBuffer.
都是可变的字符序列,但是StringBuilder 的效率高。

上一篇 经典算法(2)一文搞懂二分法查找(循环和递归两种方式)
下一篇 经典算法(4)一文搞懂什么是 快速排序

发布了81 篇原创文章 · 获赞 1692 · 访问量 24万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 鲸 设计师: meimeiellie

分享到微信朋友圈

×

扫一扫,手机浏览