高频算法面试题(二十四)- 反转字符串

187 阅读2分钟

「这是我参与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^5
  • s[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--
	}
}