题目如下:
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);
}