1. 题目描述
Write a function that takes a string as input and returns the string reversed.
Example:
Given s = “hello”, return “olleh”.
字符串反转
2. 解题思路
目前想到两种方式,一种是像快速排序一样设置两个指针,一前一后交换前后两个字符。一种是直接使用StringBuffer自带的reverse方法,好像还比较快,目前还没看懂这个是怎么实现交换的,放在下面一起研读。另外注意字符串可能为空。
3. Code
// Code1:比较正经的解法
public class Solution {
public String reverseString(String s) {
if(s.equals(null) || s.equals("") || s.length() <= 1)
{
return s;
}
StringBuffer sb = new StringBuffer(s);
int start = 0, end = s.length()-1;
// 两个指针,一前一后进行交换
while(start < end)
{
char tmp = sb.charAt(end);
sb.setCharAt(end, sb.charAt(start));
sb.setCharAt(start, tmp);
start++;
end--;
}
return sb.toString();
}
}
// Code2:比较简单的解法(比Code1要快)
public class Solution {
public String reverseString(String s) {
if(s.equals(null) || s.equals("") || s.length() <= 1)
{
return s;
}
StringBuffer sb = new StringBuffer(s);
sb = sb.reverse(); // 使用StringBuffer的reverse方法
return sb.toString();
}
}
// StringBuffer.reverse的源码
public AbstractStringBuilder reverse() {
boolean hasSurrogate = false;
int n = count - 1;
for (int j = (n-1) >> 1; j >= 0; --j) {
char temp = value[j];
char temp2 = value[n - j];
if (!hasSurrogate) {
hasSurrogate = (temp >= Character.MIN_SURROGATE && temp <= Character.MAX_SURROGATE)
|| (temp2 >= Character.MIN_SURROGATE && temp2 <= Character.MAX_SURROGATE);
}
value[j] = temp2;
value[n - j] = temp;
}
if (hasSurrogate) {
// Reverse back all valid surrogate pairs
for (int i = 0; i < count - 1; i++) {
char c2 = value[i];
if (Character.isLowSurrogate(c2)) {
char c1 = value[i + 1];
if (Character.isHighSurrogate(c1)) {
value[i++] = c1;
value[i] = c2;
}
}
}
}
return this;
}