一、题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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 <= 105 s[i] 都是 ASCII 码表中的可打印字符
二、思路分析:
分析题目,注意点如下:
1.原地修改输入数组
- 复杂度为O(1)
需要反转数组,且不允许生成新的数组,使用双指针的方法。思路如下:
初始指针 left ,right 分别向字符串的开始和末尾,指针每次各移动一次,使左右指针慢慢靠近,每次交换左右指针指向的元素。循环结束情况如下:
- 如果数组长度为奇数,最后跳出循环时 left == right,不用交换
- 如果数组长度为偶数,最后跳出循环时 left > right,不用交换
三、AC 代码:
public void reverseString(char[] s) { int left = 0; int right = s.length -1 ; while (left < right) { char temp = s[left]; s[left++] = s[right]; s[right--] = temp; } }
四、总结:
这道题目太简单了,感觉基本没有什么思考就可以写出了。这道题应该放到计划中的双指针类型的第一题,可以给刷题者增加信息,感觉位置放置不太合理。应该由易到难逐步递进会好一点,不过对于个人成就感还是很有效果的。