文章目录
题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组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 奇数长度 ,这里我们假设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。