这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
题目描述:
344. 反转字符串 - 力扣(LeetCode) (leetcode-cn.com)
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 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,右指针减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)