leetcode344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例 2:
输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]
提示:
1 <= s.length <= 105
s[i] 都是 ASCII 码表中的可打印字符
题目分析
题目描述
给定一个字符串 s
的数组表示,编写一个函数来反转这个字符串。
算法分析
这个问题可以通过双指针法来解决。我们使用两个指针,一个从字符串的开始(i
),另一个从字符串的结束(j
)。在每次迭代中,我们交换这两个指针指向的字符,然后递增 i
并递减 j
,直到 i
大于 j
。这样,字符串就被反转了。
总体思维导图
这个算法的思维导图可以表示为:
算法步骤
- 初始化两个指针
i
和j
,分别指向字符串的开始和结束。 - 当
i
<=j
时,执行以下步骤:- 交换
s[i]
和s[j]
。 i
递增,j
递减。
- 交换
- 重复步骤2直到
i
>j
。 - 字符串反转完成。
算法流程
具体代码
class Solution {
public:
void reverseString(vector<char>& s) {
int i=0;
int j=s.size()-1;
while(i<=j)
{
char temp=s[i];
s[i]=s[j];
s[j]=temp;
i++;
j--;
}
}
};
算法分析
复杂度分析
- 时间复杂度:O(n),其中 n 是数组的长度。我们只需要遍历数组一次。
- 空间复杂度:O(1),我们只需要常数级别的额外空间来存储指针。
易错点
- 在交换元素时,确保正确地交换
nums[i]
和nums[j]
。 - 注意不要在
nums[j]
为 0 时递增i
。
注意事项
- 确保在遍历数组时不要超出数组的边界。
- 在交换元素时,确保不会覆盖任何元素。
相似题目
题目 | 链接 |
---|---|
移动元素 | https://leetcode.com/problems/move-element-to-end/ |
删除元素 | https://leetcode.com/problems/remove-element/ |
颜色分类 | https://leetcode.com/problems/sort-colors/ |
如果您需要其他帮助或有其他问题,请告诉我。