344. Reverse String (字符串反转/逆序)

一、题目
Write a function that takes a string as input and returns the string reversed.

Example:
Given s = “hello”, return “olleh”.

二、分析和解答
1、首先想起两种:数组的反转和栈。栈的省略了。在数组中,第一位和最后一位交换;第二位和倒第二位交换,一直到中间的一位或者两位交换结束。其代码为:

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

有三点需要注意:
(1)for循环中不能取等于号,具体可以举个例子自己试验一下:一个奇数个元素(len/2就是中间那个数,包含就是自己和自己交换;不包含就是不交换,都对),一个偶数个元素(len/2是中间两个元素靠后的那个,不包含就是把这两个数交换,包含就是交换后再交换,出错)。
(2)如何把字符数组变为字符串?new String()或者String.valueOf(arr);
(3)碰到字符串,一定注意字符串的边界条件。显然我忘了,具体看下面。
2、从快排我们可以获得另外一种写法:

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

这样就不用考虑中间的那个位置了,包不包括都对。
3、还有一种递归的方法,我之前没有想到,代码如下:

 public String reverseString(String s) {
        if("".equals(s) || s == null)
            return s;
        String str = s.substring(1);
        return reverseString(str) + s.charAt(0);
    }

不过这样 Memory Limit Exceeded!超出内存限制,会有一个非常非常长的案例无法通过!
Note:与字符交换相关的题目大都以字符串的逆序为基础,有点是局部逆序,有的是全局逆序后再局部逆序等等等等吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值