美文网首页
LeetCode-344-反转字符串

LeetCode-344-反转字符串

作者: WindMajor | 来源:发表于2018-05-23 17:55 被阅读44次

    请编写一个函数,其功能是将输入的字符串反转过来。

    示例:

    输入:"hello"
    输出:"olleh"
    

    分析:

    题目意思很简单,很容易理解。就是把字符串给倒序输出,并且不使用系统提供的API。

    下面使用多种解法解答:

    解法一:

    把String转换成char字符数组,然后倒序遍历这个数组,把结果存入StringBuilder里面。

        public String reverseString(String s) {
            if (s == null || s.length() == 0) {
                return s;
            }
    
            StringBuilder builder = new StringBuilder();
            char[] chars = s.toCharArray();
            for (int i = chars.length - 1; i >= 0; i--) {
                builder.append(chars[i]);
            }
            return builder.toString();
        }
    
    解法二:

    新建一个char类型的数组,倒序存放用来存放String的每一个字符。

        public String reverseString(String s) {
            if (s == null || s.length() == 0) {
                return s;
            }
    
            int length = s.length();
            char[] array = new char[length];
            for (int i = 0; i < length; i++) {
                array[i] = s.charAt(length - 1 - i);
            }
            return new String(array);
        }
    

    实际上还有优化解法,遍历只需要执行字符串长度的一半即可。

    public String reverseString(String s) {
            if (s == null || s.length() == 0) {
                return s;
            }
    
            char[] chars = s.toCharArray();
            int length = chars.length;
            char temp;
            for (int i = 0; i < length / 2; i++) {
                temp = chars[i];
                chars[i] = chars[length - 1 - i];
                chars[length - 1 - i] = temp;
            }
            return new String(chars);
        }
    
    解法三:

    使用栈,后进先出的特点正好用于反转字符串。把字符串转换为char数组,创建Stack对象,把char数组压入栈,在依次弹出。

        public String reverseString(String s) {
            if (s == null || s.length() == 0) {
                return s;
            }
    
            char[] chars = s.toCharArray();
    
            Stack<Character> stack = new Stack<>();
            for (char c : chars) {
                stack.push(c);
            }
    
            for (int i = 0; i < chars.length; i++) {
                chars[i] = stack.pop();
            }
            return new String(chars);
        }
    
    解法四:

    利用异或交换位置的方法,char类型的字符本质上是整数。

    char:  H  e   l   l   o
    ASCII: 72 101 108 108 111
    

    利用异或交换公式:

    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    

    代码如下:

        public String reverseString(String s) {
            if (s == null || s.length() == 0) {
                return s;
            }
    
            char[] chars = s.toCharArray();
            int value = s.length() - 1;
            for (int i = 0; i < value; i++, value--) {
                chars[i] ^= chars[value];
                chars[value] ^= chars[i];
                chars[i] ^= chars[value];
    
            }
            return new String(chars);
        }
    
    解法五:

    反转字符串可以理解为,第一个字符和剩下所有的字符串交换位置,交换完之后,剩下的字符串又可以理解为第一个字符和再剩下的所有字符串交换。

    "abcdef" --> "bcdef" "a"
    "bcdefa" --> "cdef" "b" "a"
    "cdefba" --> "def" "c" "ba"
    "defcba" --> "ef" "d" "cba"
    "efdcba" --> "f" "e" "dcba"
    "fedcba"
    

    最终,fedcba就是需要的结果。
    所以我们可以使用递归的方法,递归执行,直到剩下的字符传长度为1。但这种方法仅提供一种解题思路,因为效率比较低,超出了平台的时间限制。

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

    参考链接:https://www.cnblogs.com/JohnTsai/p/5606719.html

    相关文章

      网友评论

          本文标题:LeetCode-344-反转字符串

          本文链接:https://www.haomeiwen.com/subject/njtdjftx.html