外观
字符串原地反转
⭐ 题目日期:
字节 - 2024/12/1
🌳 题目描述:
给定一个字符串数组,不用内置函数,原地将字符串反转过来。
示例 1:
输入:s = ["s", "h", "a", "n", "y", "a", "n", "g"]
输出:["g","n","a","y","n","a","h","s"]
🕵🏽 面试评估:
本题属于基础算法题,考察候选人是否通过理解双指针法的基本原理,对输入的字符数组实现原地的反转,且能够正确地判断出双指针的移动逻辑和终止条件。
🧗难度系数:
⭐️
📝思路分析:
具体过程图解如下,这道题我们采用的是双指针写法,利用双指针分别指向首尾的元素:
- 左指针从字符串的第一个元素出发,右指针从字符串的最后一个元素出发。
- 每次交换左指针和右指针所指的字符。
- 随后左指针向右移动,右指针向左移动,直至左指针与右指针相遇或左指针超过右指针。
- 当左指针和右指针相遇,即
left == right
,表示中间的字符无需交换。 - 当左指针超过右指针,即
left > right
,表示已经完成整个字符串的反转。
- 当左指针和右指针相遇,即
💻代码(Java、Python):
Java
public void reverseString(char[] s) {
int left = 0; //指向字符数组第一个元素
int right = s.length - 1; //指向字符数组最后一个元素
while (left < right) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
//指针移动
left++;
right--;
}
}
Python
def reverseString(self, s):
left = 0 # 指向字符数组第一个元素
right = len(s) - 1 # 指向字符数组最后一个元素
while left < right:
temp = s[left]
s[left] = s[right]
s[right] = temp
# 指针移动
left += 1
right -= 1
🚵🏻复杂度分析:
- 时间复杂度:O(n),其中 n 为字符串数组中元素的个数,所有元素都被访问一次。
- 空间复杂度:O(1),只使用了常数级别的额外空间。