题目:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例一:
输入:s = ["h","e","l","l","o"] 输出:["o","l","l","e","h"]
示例二:
输入:s = ["H","a","n","n","a","h"] 输出:["h","a","n","n","a","H"]
提示:
1 <= s.length <= 105
s[i]
都是 ASCII 码表中的可打印字符
思路:
首先,我们根据题目可以拿到几个信息:
1.不允许使用另外的数组分配额外的空间
2.原地修改输入数组
在看完题目之后,我们可以想到数组翻转经常会使用的方法:双指针。即一个指针在数组的开头(左指针),一个指针在数组的结尾(右指针),当数组个数为奇数时,左指针和右指针最终会在数组中间的位置汇合,而当数组个数为偶数时,左指针和右指针会停留在数组中间位置旁边的两个位置。
在确定使用双指针之后,我们考虑到需要修改数组,所以我们在代码编写时会使用到变量的交换,所以我们需要设定一个临时变量来完成交换,下面我们就可以开始去写代码
代码:
class Solution {
public:
void reverseString(vector<char>& s) {
if(s.size() == 1) return;
char temp;
int left = 0;
int right = s.size() - 1;
while(left < right){
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
};
if(s.size() == 1) return;
这条语句是根据题目当中字符数组长度最少为1,当长度为1时,翻转数组和原数组是一样的,所以直接返回即可。
char temp;
int left = 0;
int right = s.size() - 1;
这些是变量的一些设置,其中temp就是我们之前说的临时变量,left就是左指针,它代表着左指针所在数组位置的下标,right就是右指针,同理。
while(left < right){
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
这段就是双指针主要的代码。其中while(left<right)就是为了限制双指针的运行情况,无论数组个数为奇数或偶数,都是可以完成双指针的操作。
进入while循环里面时,下面三行就是完成左指针和右指针的交换,下面两行就是左指针向后移动一个位置,右指针向前移动一个位置,然后这一层循环结束,再次进行while循环()中的判断,直到完成。
时间复杂度:O(N)
空间复杂度:O(1)