算法思想一:反向遍历
解题思路:
题目要求对给出的字符串进行反转,首先想到的是通过对字符进行反向遍历,遍历的顺序就是字符串的反转结果
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表示字符串的长度,变换操作都是遍历操作
空间复杂的:不需要额外空间或仅需要常数级空间



京公网安备 11010502036488号