Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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;
}
}
四、总结:
这道题目太简单了,感觉基本没有什么思考就可以写出了。这道题应该放到计划中的双指针类型的第一题,可以给刷题者增加信息,感觉位置放置不太合理。应该由易到难逐步递进会好一点,不过对于个人成就感还是很有效果的。
写题解不易,若对你有帮助,点赞评论再走吧。ヽ(✿゚▽゚)ノ