题目:反转字符串
leetcode链接:344. 反转字符串 - 力扣(Leetcode)
说明:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
理解:
1、反转给定字符串数组
2、原地实现,不能使用额外的空间
思路:
1、对称交换
2、双指针
3、递归
题解:
方案一:对称交换
/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var reverseString = function(s) {
const len = s.length
for (let i = 0; i < s.length/2; i++) {
let temp = s[i]
s[i] = s[len - 1 -i]
s[len - 1 - i] = temp
}
};
方案二:双指针 - 临时变量
/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var reverseString = function(s) {
const length = s.length;
//两个指针一个从第1个,一个从最后一个开始,
//两两交换
let left = 0;
let right = length - 1;
while (left < right) {
let temp = s[left];
s[left] = s[right];
s[right] = temp;
left++
right--
}
};
方案三:双指针 - 解构
/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var reverseString = function(s) {
const n = s.length;
for (let left = 0, right = n - 1; left < right; ++left, --right) {
[s[left], s[right]] = [s[right], s[left]];
}
};
方案四:递归实现
/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var reverseString = function(s) {
if (s == null || s.length == 0)
return;
reverseStringHelper(s, 0, s.length - 1);
};
var reverseStringHelper = (array, left, right) => {
if (left >= right)
return;
let temp = array[left];
array[left] = array[right];
array[right] = temp;
reverseStringHelper(array, ++left, --right);
}
总结:
本篇记录了4种实现反转字符串的方式,综合来看采用临时变量实现数据交换的方式效率较低,同是双指针实现,采用数据解构的方式看起来效率高多了,就不知leetcode统计的方式是否存在偏差。