LeetCode.344 反转字符串

263 阅读2分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

题目描述:

344. 反转字符串 - 力扣(LeetCode) (leetcode-cn.com)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1)O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

思路分析

双指针

假设反转前的字符串数组为 s[0] s[1] s[2] ... s[lastIndex - 1],

那么反转后的字符串数组为 s[lastIndex - 1] s[lastIndex - 2] ... s[0]。

比较反转前后下标变化很容易得出 s[i] 的字符与 s[lastIndex - i] 的字符发生了交换的规律

因此我们步骤如下:

  1. 定义左右指针,左指针指向字符串的第一个字符, 右指针指向字符串的最后一个字符
  2. 当左指针所指的下标小于右指针所指的下标时,进入循环, 否则结束循环
  3. 交换左右指针指向的元素之后,左指针加1,右指针减1, 继续步骤1,2, 直至交换完成

AC代码

class Solution {
    fun reverseString(s: CharArray): Unit {
        var i = 0;
        var j = s.lastIndex
        while (i < j) {
            s[i] = s[j].also { s[j] = s[i] }
            i++
            j--
        }
    }
}

总结

很简单的双指针法,由于我们使用的是Kotlin,他有很多的高级语法糖,此题中两数交换我们就使用了Kotlin的标准函数 T.also()

参考

反转字符串 - 反转字符串 - 力扣(LeetCode) (leetcode-cn.com)

「代码随想录」带你搞定字符串!344. 反转字符串:【双指针法】详解 - 反转字符串 - 力扣(LeetCode) (leetcode-cn.com)

双指针逆序字符串 - 反转字符串 - 力扣(LeetCode) (leetcode-cn.com)

左右指针-Kotlin-Java - 反转字符串 - 力扣(LeetCode) (leetcode-cn.com)