344. Reverse String 字符串反转

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

Example:
Given s = “hello”, return “olleh”.
2、分析与解答
最基本的想法就是首尾交换,将第一个与最后一个,第二个与倒第二个交换,依次进行直到中间即可。

class Solution {
    public String reverseString(String s) {
        int len = s.length();
        char[] arr = s.toCharArray();
        int low = 0;
        int high = len - 1;
        while(low < high){
            char tmp = arr[low];
            arr[low] = arr[high];
            arr[high] = tmp;
            low++;//这里易忘
            high--;
        }
        return String.valueOf(arr);//将字符数组转换为字符串
    }
}

3、变换顺序,使用明显管用

public String reverseString(String s) {
        int len = s.length();
        char[] arr = s.toCharArray();
        Stack<Character> stack = new Stack<Character>();
        for(int i=0;i<len;i++){
            stack.push(arr[i]);
        }
        StringBuilder sb = new StringBuilder();
        while(!stack.isEmpty())
            sb.append(stack.pop());
        return sb.toString();
    }

注意:这里使用了StringBuilder来追加字符。
4、使用位运算中的异或
使用异或可以在不引入第三变量的情况下交换两个变量的值,如下:
A = A ^ B;
B = A ^ B ( = A );
A = B ^ A (= A ^ A ^ B = B);
即把第一种方法中的交换改为二进制的即可。有一点要注意:必须要进行(char)的强制转换。

public String reverseString(String s) {
        char[] arr = s.toCharArray();
        int low = 0;
        int high = arr.length - 1;
        while(low < high){
            arr[low] = (char)(arr[low] ^ arr[high]);//注意这里
            arr[high] = (char)(arr[low] ^ arr[high]);
            arr[low] = (char)(arr[high] ^ arr[low]);
            low++;
            high--;
        }
        return new String(arr);
    }

5、补充:当然还有一些别的算法,比如根据字符数组逆序输出,还可以递归

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

递归原理:每次把字符串的第一位移动到最后一位,如果只剩一个(或为空),直接返回。

可以参考:https://www.cnblogs.com/JohnTsai/p/5606719.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值