力扣之反转字符串之原地修改输入数组(双指针方式)
题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
示例 2:
提示: 都是 ASCII 码表中的可打印字符 力扣原题目地址:https://leetcode.cn/problems/reverse-string/description/?languageTags=javascript
思路解法
分析
大多数人,看到这个题目以后,心想:呵!直接调用数组的reverse()方法不就行啦。其实这的确是一种解决方案。只不过题目要求:原地修改输入数组、使用 O(1) 的额外空间。也就是说,要尽可能使用较小的内存去操作,这也是性能优化的一种尝试。
我们想一下,其实数组的reverse()方法的最终效果是,反转一个数组,如:
我们发现,反转以后的数组只不过是首尾对应位置颠倒了罢了,换句话说,就是位置交换,位置交换,位置交换
那么,一说到数组的位置交换,我们会想到哪几种方式呢?
1.使用临时变量交换, 如下:
冒泡排序的感觉…
2.使用ES6的解构赋值进行操作, 如下:
通过上述方式,我们发现,既然是交换对应位置的两个元素,那么只要这两个元素的索引咱们知晓即可。在心中默念,两个元素的索引、两个元素的索引、两个…
哎,有了,双指针啊!
双指针方式
我们定义两个变量,left和right,分别来表示对应的、需要交换位置的元素的、索引。然后一开始left值是0,right的值是arr.length-1。即为要交换第一个和最后一个位置的值。通过上文中交换数组位置的方式交换完毕以后,说明第一个和最后一个已经交换完成了然后就交换第二个,和倒数第二个然后继续交换第三个,和倒数第三个即为left递增,right递减但是交换总有停下来的时候(结束条件)当left等于right时(奇数项数组)或者left大于right时(偶数项数组)就不再继续交换了也就是说,只要不满足结束条件,我就继续交换位置操作换句话说,只要处在条件内,我就持续执行操作只要符合xxx条件,就继续执行操作(直到不符合条件时停下来不操作了),我们想到了while循环 奇数项数组中间位的那一项不用动,偶数项是全部两两交换一下
代码(临时变量交换)
代码(ES6解构交换)
提交LeetCode结果图
使用temp临时变量,速度更快,但是内存多耗费了一些使用ES6解构赋值交换位置,虽然速度慢了一点点,但是内存省下来一些了这不是重点,重点是双指针的方式
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/95905.html