【算法】字符串:反转字符串

173 阅读1分钟

题目:反转字符串

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
    }
};

image.png

方案二:双指针 - 临时变量

/**
 * @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--
    }
};

image.png

方案三:双指针 - 解构

/**
 * @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]];
    }
};

image.png

方案四:递归实现

/**
 * @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);
}

image.png

总结:

本篇记录了4种实现反转字符串的方式,综合来看采用临时变量实现数据交换的方式效率较低,同是双指针实现,采用数据解构的方式看起来效率高多了,就不知leetcode统计的方式是否存在偏差。