Reverse String

题目如下:
Write a function that takes a string as input and returns the string reversed. Example: Given s = “hello”, return “olleh”.
基本思路就是将字符串转成数组再逆序拼接成字符串。但是如果用String存储字符串耗时很大。String对象是不可改变的。每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String对象相关的系统开销可能会非常昂贵。可以使用StringBuffer进行优化,算法如下:

public class Solution {
    public String reverseString(String s) {
        char[] arr = s.toCharArray();
        StringBuffer res = new StringBuffer();
        for(int i = arr.length-1;i>=0;i--){
            res.append(arr[i]); 
        }
        return res.toString();
    }
}

如果程序对附加字符串的需求很频繁,不建议使用+来进行字符串的串联。可以考虑使用java.lang.StringBuilder 类。算法如下:

public class Solution {
    public String reverseString(String s) {
        return  new StringBuilder(s).reverse().toString();
    }
}

该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候,它比 StringBuffer 要快。两者的方法基本相同。
另一个思路是交换第一个和最后一个字符。算法如下:

public String reverseString(String s) {
    char[] arr = s.toCharArray();
    char tmp;
    int i = 0;
    int j = arr.length-1;
    while(i<j) {
        tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
        i++;
        j--;
    }
    return new String(arr);
}

交换字符时有一种新思路(a^b)^b=a其中^为异或,这样不需要一个临时字符。算法如下:

public String reverseString(String s) {
    byte[] bytes = s.getBytes();
    int i = 0;
    int j = s.length() - 1;
    while (i < j) {
        bytes[i] = (byte)(bytes[i] ^ bytes[j]);
        bytes[j] = (byte)(bytes[i] ^ bytes[j]);
        bytes[i] = (byte)(bytes[i] ^ bytes[j]);
        i++;
        j--;
    }
    return new String(bytes);
}

另一种思路,利用递归交换前半字符串和后半字符串。算法如下:

public String reverseString(String s) {
    if(s.length() <= 1)
        return s;
    String leftString = s.substring(0,s.length()/2);
    String rightString = s.substring(s.length()/2,s.length());
    return reverseString(rightString) + reverseString(leftString);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值