题目:字符串反转,如将字符串 “www.runoob.com” 反转为 “moc.boonur.www”
程序分析
要实现字符串的反转,可以考虑从两端向中间遍历,并交换对应位置上的字符。
方法1:使用StringBuilder
解题思路
使用StringBuilder的reverse方法可以方便地将字符串反转。
实现代码
public class StringReversal {
public static String reverseWithStringBuilder(String str) {
StringBuilder reversedStr = new StringBuilder(str);
return reversedStr.reverse().toString();
}
public static void main(String[] args) {
String str = "www.runoob.com";
System.out.println("Original string: " + str);
String reversedStr = reverseWithStringBuilder(str);
System.out.println("Reversed string: " + reversedStr);
}
}
优缺点
- 优点:
- 实现简单,一行代码即可完成。
- StringBuilder拥有高效的字符串操作,性能较好。
- 缺点:
- 使用了额外的StringBuilder对象,占用一定的内存空间。
方法2:使用字符数组
解题思路
将字符串转换成字符数组,然后使用两个指针分别从头和尾交换对应位置上的字符,直至遍历到中间位置。
实现代码
public class StringReversal {
public static String reverseWithCharArray(String str) {
char[] charArray = str.toCharArray();
int start = 0;
int end = str.length() - 1;
while (start < end) {
// Swap characters at start and end positions
char temp = charArray[start];
charArray[start] = charArray[end];
charArray[end] = temp;
// Move the pointers towards the center
start++;
end--;
}
return new String(charArray);
}
public static void main(String[] args) {
String str = "www.runoob.com";
System.out.println("Original string: " + str);
String reversedStr = reverseWithCharArray(str);
System.out.println("Reversed string: " + reversedStr);
}
}
优缺点
- 优点:
- 使用字符数组进行操作,无需额外的内存空间。
- 性能较好,比StringBuilder方式更节省内存。
- 缺点:
- 需要显式地处理字符数组的操作。
方法3:递归方式
解题思路
利用递归,将字符串的第一个字符与最后一个字符交换,然后对剩余部分递归地进行反转。
实现代码
public class StringReversal {
public static String reverseRecursive(String str) {
if (str == null || str.length() <= 1)
return str;
return reverseRecursive(str.substring(1)) + str.charAt(0);
}
public static void main(String[] args) {
String str = "www.runoob.com";
System.out.println("Original string: " + str);
String reversedStr = reverseRecursive(str);
System.out.println("Reversed string: " + reversedStr);
}
}
优缺点
- 优点:
- 使用递归,代码简洁。
- 缺点:
- 可能会导致栈溢出,特别是对于较长的字符串。
总结与推荐
- 方法1(StringBuilder方式)简洁高效,适用于一行代码搞定字符串反转,适用于大多数场景。
- 方法2(字符数组方式)也简单高效,性能较好且节省内存,适用于对内存有较高要求的场景。
- 方法3(递归方式)代码简洁,但可能会导致栈溢出,不适用于较长的字符串。
推荐使用方法1(StringBuilder方式)作为最优方法,特别适用于简单的字符串反转。方法2(字符数组方式)也是一种不错的选择,适用于对内存要求较高的场景。方法3(递归方式)虽然简洁,但不适用于较长的字符串反转。