参考部分,如有侵权,请联系删除。
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例 2:
输入:[“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]
方法一、遍历交换
思路:字符串数组要么长度为偶数要么长度为奇数。然后以mid为对称交换。
Java解法
class Solution {
public void reverseString(char[] s) {
int n = s.length,mid = 0;
if(n%2 == 0){
mid = n/2-1;
}
else{
mid = n /2;
}
char temp = 0;
for(int i = n-1;i>mid;i--){
temp = s[i];
s[i] = s[n-1-i];
s[n-1-i] = temp;
}
}
}
耗时1ms
复杂度分析
时间复杂度:O(N),其中 N 为字符数组的长度。一共执行了 N/2次的交换。
空间复杂度:O(1)。只使用了常数空间来存放若干变量。
方法二、Python列表
Python解法1
思路:因为s是个列表,所以直接reverse
class Solution(object):
def reverseString(self, s):
"""
:type s: List[str]
:rtype: None Do not return anything, modify s in-place instead.
"""
s.reverse()
耗时48ms
Python解法2
参考Python3 两种方法实现反转字符串
思路:另一种倒序解法s[::-1]
class Solution(object):
def reverseString(self, s):
"""
:type s: List[str]
:rtype: None Do not return anything, modify s in-place instead.
"""
s[:] = s[::-1]
耗时40ms
但是这里我不太理解为什么不是s = s[::-1],然后看了参考的解释就明白了
s[:]=s[::-1]表示将原数组反转后赋值给s中每一个对应的位置
s=s[::-1]表示将s反转后赋值给新的对象s(可以通过id函数查看内存地址),与题意原地修改不符。
Bingo!!!!
方法三:双指针
官方解答
思路:
前后交换
将 left 指向字符数组首元素,right 指向字符数组尾元素。
当 left < right:
交换 s[left] 和 s[right];
left 指针右移一位,即 left = left + 1;
right 指针左移一位,即 right = right - 1。
当 left >= right,反转结束,返回字符数组即可。
class Solution {
public void reverseString(char[] s) {
int n = s.length;
for (int left = 0, right = n - 1; left < right; ++left, --right) {
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
}
}
}
复杂度分析
时间复杂度:O(N),其中 N 为字符数组的长度。一共执行了 N/2次的交换。
空间复杂度:O(1)。只使用了常数空间来存放若干变量。
总结
比较推荐第一种和第三种解法。第一种是我自己写,接近双100%。
博主比较小白,但是热爱分享。一直感觉自己写代码的能力,算法能力都不太行,所以最近开始刷LeetCode,一方面记录方便自己学习,另一方面给需要的同伴参考。虽然失败并不可怕,但是也希望同伴们少踩一些坑。分析算法挺费劲的,留个赞或评论支持一下博主吧!同时我也非常希望写出更通俗易懂的文章,知识尚浅,如有遗漏或错误,欢迎指正~