算法思想一:反向遍历

解题思路:

题目要求对给出的字符串进行反转,首先想到的是通过对字符进行反向遍历,遍历的顺序就是字符串的反转结果

1、定义返回字符

2、循环反向遍历字符串 str,将遍历的字符添加到返回字符串中

3、返回 res

代码展示:

Python版本

class Solution:
    def solve(self , str ):
        # write code here
        # 初始化返回字符串
        res = ''
        # 从后向前遍历字符串 str,
        for i in range(len(str)-1, -1, -1):
            # 将遍历的字符串添加到res中
            res += str[i]
        return res

复杂度分析

时间复杂度:N表示字符串的长度,遍历字符串时间

空间复杂的:N表示字符串的长度,返回字符串占用的空间

算法思想二:双指针

解题思路:

首先将字符串转换为字符数组,对于长度为 N 的待被反转的字符数组,可以观察反转前后下标的变化,假设反转前字符数组为 ,那么反转后字符数组为 。比较反转前后下标变化很容易得出 的字符与 的字符发生了交换的规律,因此可以得出如下双指针的解法:
1、将 指向字符数组首元素,right 指向字符数组尾元素。
2、当
1、交换
2、 指针右移一位,即
3、 指针左移一位,即
3、当 ,反转结束,将字符数组转换为字符串返回即可

图解:

代码展示:

JAVA版本

import java.util.*;
public class Solution {
    /**
     * 反转字符串
     * @param str string字符串 
     * @return string字符串
     */
    public String solve (String str) {
        // write code here
        // 字符串转为字符数组
        char[] cstr = str.toCharArray();
        // 字符串的长度
        int n = str.length();
        // 双指针,从两头往中间遍历
        for (int left = 0, right = n - 1; left < right; ++left, --right) {
            // 交换双指针对应的字符
            char tmp = cstr[left];
            cstr[left] = cstr[right];
            cstr[right] = tmp;
        }
        // 重新转为 字符串
        return new String(cstr);
    }
}

复杂度分析

时间复杂度表示字符串的长度,一共执行了 次交换

空间复杂的:使用字符数组占用空间

算法思想三:库函数

解题思路:

一般情况下此种方法不推荐使用,只作了解即可

代码展示:

Python版本

class Solution:
    def solve(self , str ):
        # write code here
        # 函数库
        return str[::-1]

JAVA版本

import java.util.*;
public class Solution {
    public String solve (String str) {
        StringBuffer sb =new StringBuffer(str);//此方法针对的是io流,不能针对字符串。
        return sb.reverse().toString();
    }
}

C++版本

class Solution {
public:
    string solve(string str) {
       reverse(str.begin(),str.end());
       return str;
    }
};

复杂度分析

时间复杂度:N表示字符串的长度,变换操作都是遍历操作

空间复杂的:不需要额外空间或仅需要常数级空间