算法修炼之路—【字符串】Leetcode 344 反转字符串

文章目录

题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组,使用O(1)的额外空间解决这一问题。

你可以假设数组中的所有字符都是ASCII码表中的可打印字符。

示例1:

输入: arrC = [“h”, “e”, “l”, “l”, “o”]
输出: [ “o”, , “l”, “l”, “e”, “h”]

示例2:

输入: arrC = [“H”, “a”, “n”, “n”, “a”, “h”]
输出: [“h”, “a”, “n”, “n”, “a”, “H”]

思路分析

难度是简单 , 如果对链表类题目比较熟悉,基于数组的交换元素值就会比较得心应手。这道题我们需要反转字符串,我们可以分两种情况:

  1. 字符串数组长度为奇数
  2. 字符串数组长度为偶数

对于情况1 奇数长度 ,这里我们假设len = 5,则下标交换对分别为0->4, 1->3,这里是i -> len-i-1,截止点位下标为index = 2的点;

对于情况2 偶数长度 ,这里我们假设len = 2,则下标交换对分别为0->3, 1->2,这里同**情况1 **,交换规则为i -> len-i-1,当i进行到一半时截止;

这时我们可以直接总结出规律,将交换主题代码放入for循环中,截至条件为i < len>>1。当为奇数时,len >> 1刚好在中心下标的前一元素交换后停止循环;当为偶数时,len >> 1刚好在左半部分交换后停止循环,则这里直接给出代码有:

解题代码

    public static char[] solution(char[] input) {
        if(input == null || input.length == 1) return input;
        
        int len = input.length;
        
        for(int i = 0; i < len>>1; i++){
            char tmpC = input[i];
            input[i] = input[len - i - 1];
            input[len - i - 1] = tmpC;
        }
        return input;
        
    }

复杂度分析

这里我们设n为输入字符数组的长度;

时间复杂度: 我们对数组进行了len >> 1次访问,即n/2,故时间复杂度为O(n);
空间复杂度: 如题目要求,没有使用额外辅助容器,空间复杂度为O(1);

Github源码

完整可运行文件请访问GitHub

上一篇:div从上到下展现 隐藏


下一篇:Leetcode 525 连续数组 前缀和 + 哈希