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 <= Math.pow(10, 5)s[i]都是 ASCII 码表中的可打印字符
二、思路分析:
- 第一种:数组的
reverse方法,简单粗暴 - 区分数组长度,然后对称的进行值的替换,(不知道声明中间变量是不是违反了
不要给另外的数组分配额外的空间的规则,我看题解区很多大佬也声明了中间的变量,只要不声明数组应该没事吧)- 当数组长度时偶数的时候,刚好进行两两交换,遍历的取值范围为数组长度除以
2 - 当数组为偶数的时候,最中间的那个值是不用动的,例如
[1,2,3]和[3,2,1],所以遍历的取值范围为数组长度减去1除以2
- 当数组长度时偶数的时候,刚好进行两两交换,遍历的取值范围为数组长度除以
三、AC 代码:
function reverseString(s: string[]): void {
// s.reverse();
if(s.length % 2 === 0){
for(let i = 0; i < s.length / 2; i++){
let num = s[i];
s[i] = s[s.length - 1 - i]
s[s.length - 1 - i] = num
}
} else {
for(let i = 0; i < (s.length - 1) / 2; i++){
let num = s[i];
s[i] = s[s.length - 1 - i]
s[s.length - 1 - i] = num
}
}
};
四、总结:
- 其实这个声明一个中间变量保存的方式和冒泡排序的做法一样
- 看了下题解区的大佬用的双指针,似懂非懂。。。更多解题方式,移步题解区