反转字符串I

177 阅读2分钟

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
        }
    }
};

四、总结:

  • 其实这个声明一个中间变量保存的方式和冒泡排序的做法一样
  • 看了下题解区的大佬用的双指针,似懂非懂。。。更多解题方式,移步题解区

image.png