「这是我参与11月更文挑战的第 12 天,活动详情查看:2021最后一次更文挑战」
刷算法题,从来不是为了记题,而是练习把实际的问题抽象成具体的数据结构或算法模型,然后利用对应的数据结构或算法模型来进行解题。个人觉得,带着这种思维刷题,不仅能解决面试问题,也能更多的学会在日常工作中思考,如何将实际的场景抽象成相应的算法模型,从而提高代码的质量和性能
反转字符串
题目来源:LeetCode-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 <= 10^5s[i]都是 ASCII 码表中的可打印字符
解题
解法一:双指针
思路
这个就非常简单了,双指针轻松解决。如果你看过我前边刷的一些题,会发现像相交链表、删除链表倒数第N个节点、链表中环的入口、判断链表中是否有环等等,都可以使用双指针来解决
这道很简单,一个指针指向字符串的第一个元素,一个指针指向字符串的最后一个元素,两个指针同时往中间变量,变量过程中交换值即可
后边的题会进行分类的刷,感觉这样比较容易分块掌握,零碎的刷,适合查漏补缺。所以后边会先针对二叉树的题进行刷,然后是深度优先、广度优先、回溯、贪心、动态规划
代码
//反转字符串
func reverseString(s []byte) {
left, right := 0, len(s)-1
for ; left < right; left++ {
s[left], s[right] = s[right], s[left]
right--
}
}