将
l
e
f
t
left
left 指向字符数组首元素,
r
i
g
h
t
right
right指向字符数组尾元素。
当
l
e
f
t
left
left <
r
i
g
h
t
right
right:
交换
s
[
l
e
f
t
]
s[left]
s[left] 和
s
[
r
i
g
h
t
]
s[right]
s[right];
l
e
f
t
left
left指针右移一位,即
l
e
f
t
left
left=
l
e
f
t
left
left + 1;
r
i
g
h
t
right
right指针左移一位,即
r
i
g
h
t
right
right =
r
i
g
h
t
right
right - 1。
当
l
e
f
t
left
left>=
r
i
g
h
t
right
right,反转结束,返回字符数组即可。
2.代码实现
classSolution{publicvoidreverseString(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;}}}
3.复杂度分析
时间复杂度:
O
(
N
)
O(N)
O(N),其中
N
N
N为字符数组的长度。一共执行了
N
/
2
N/2
N/2次的交换。
空间复杂度:
O
(
1
)
O(1)
O(1),只使用了常数空间来存放若干变量。
LeetCode:541_反转字符串II
解决方案:
1.思路:使用快慢指针
2.代码实现
classSolution{publicStringreverseStr(String s,int k){int n = s.length();char[] arr = s.toCharArray();for(int i =0; i < n; i +=2* k){reverse(arr, i,Math.min(i + k, n)-1);}returnnewString(arr);}publicvoidreverse(char[] arr,int left,int right){while(left < right){char temp = arr[left];
arr[left]= arr[right];
arr[right]= temp;
left++;
right--;}}}