[路飞]_一起刷leetcode 344. 反转字符串

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

题目

344. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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 码表中的可打印字符

暴力解法

思路

  1. 直接调用Array.reverse()旋转原数据,一行代码十秒钟解决问题,完美

实现

/**
 * @param {character[]} s
 * @return {void} Do not return anything, modify s in-place instead.
 */
var reverseString = function(s) {
    return s.reverse
};
复制代码

好了,本期题解到此结束,谢谢大家...

开个玩笑哈哈,算法题嘛,咱们可以考虑从时间复杂度上做出更优解

优化

  1. 这道题想逼格高点可以用双指针,一个从头开始,一个从尾开始;
  2. 每次交换头尾指针的元素,直到双指针相遇;
  3. 当然其实定义头指针就行了, 数组的长度n减去头指针i就是尾指针的位置了n - i
  4. 位置也不用判断每次是否相遇,一人走一半路就行了。

优化代码

/**
 * @param {character[]} s
 * @return {void} Do not return anything, modify s in-place instead.
 */
var reverseString = function(s) {
    const n = s.length;
    // 向下取整即可,中间如果只有一个元素不用管
    const mid = Math.floor(n / 2);

    for (let i = 0; i < mid; i++) {
        // 交换元素
        [s[i], s[n - 1- i]] = [s[n - 1- i], s[i]];
    }

    return s;
};
复制代码

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。

猜你喜欢

转载自juejin.im/post/7032534886384664606
今日推荐