反转字符串
描述:
编写一个函数, 其作用是将输入的字符串反转过来.
示例 1:
输入: "hello"
输出: "olleh"
示例 2:
输入: "A man, a plan, a canal: Panama"
输出: "amanaP :lanac a ,nalp a ,nam A"
思路:
其实这道题我们很容易可以想到使用数组下标的方法, 将字符串转换为 char 数组, 遍历数组重新赋值. 其中观察反转字符串可以知道, 两个反转字符串字符的下标之和为字符串长度 - 1.
比如示例 1 中, h 对应数组下标为 0, 反转后的 h 对应数组下标为 4, 0 + 4 = 5 -1.
代码如下:
- public class ReverseString {
- public String reverseString(String s) {
- if (s == null || s.length() == 0) {
- return s;
- }
- int length = s.length();
- char[] array = s.toCharArray();
- for (int i = 0; i < length / 2; i++) {
- char tmp = array[i];
- array[i] = array[length - 1 - i];
- array[length - 1 - i] = tmp;
- }
- return new String(array);
- }
- public static void main(String[] args) {
- String s = "hello";
- ReverseString reverseString = new ReverseString();
- System.out.println(reverseString.reverseString(s));
- }
- }
优化:
上边我们使用了交换数组下标的方法, 其实 java 中有个函数叫 charAt(), 解释如下:
charAt() 方法用于返回指定索引处的字符. 索引范围为从 0 到 length() - 1.
所以我们更改我们的代码如下:
- public class ReverseString {
- public String reverseString(String s) {
- if (s == null || s.length() == 0) {
- return s;
- }
- int length = s.length();
- char[] array = s.toCharArray();
- for (int i = 0; i < length; i++) {
- array[i] = s.charAt(length - 1 -i);
- }
- return new String(array);
- }
- public static void main(String[] args) {
- String s = "hello";
- ReverseString reverseString = new ReverseString();
- System.out.println(reverseString.reverseString(s));
- }
- }
但其实 java 中还有个更简单的反转函数 reverse(), 就可以用来反转字符串, 利用该方法, 我们可以做到只写一行代码:
- public class ReverseString {
- public String reverseString(String s) {
- if (s == null || s.length() == 0) {
- return s;
- }
- return new StringBuffer(s).reverse().toString(); // 即这行
- }
- public static void main(String[] args) {
- String s = "hello";
- ReverseString reverseString = new ReverseString();
- System.out.println(reverseString.reverseString(s));
- }
- }
总结:
可以看到, 我们使用反转函数 reverse(), 代码最少最简洁, 但是直接调用 API 这种方法肯定跟我们刷 leecode 的初衷是不符的, 理解字符串反转的思路是很重要的, 是吧是吧 (眨眼).
来源: http://www.jianshu.com/p/1d36b40b3ef6