# 344. Reverse String
## 題目敘述

## 初步想法
我一剛開始是覺得可以直接用內建function reverse,但設想如果在其他語言中沒有這個結構該怎麼辦?於是乎有了其他辦法。
## 解題
### W1 直接用 reverse
```
var reverseString = function(s) {
s.reverse();
};
```
#### 說明:
reverse() 方法用來將陣列倒轉,將第一個元素換到最後一個,最後一個元素換到第一個,依此類推,返回倒轉後的陣列。 因此不用在意[in place](https://en.wikipedia.org/wiki/In-place_algorithm)的問題
### W2 雙指針
```
var reverseString = function(s) {
let left = 0
let right = s.length-1
while(left < right){
[s[left], s[right]] = [s[right], s[left]]
left ++
right--
}
};
```
#### 說明:
JavaScript ES6 寫法
```
let a = 1, b = 2;
[a, b] = [b, a]
```
#### 時間複雜度: O(logn)
#### 疑問:
其中我在while多加一道比較,在兩者內容不同的前提下在做交換,想減少其交換的次數,但error
```
var reverseString = function(s) {
let left = 0
let right = s.length-1
while(left < right && s[left] != s[right]){
[s[left], s[right]] = [s[right], s[left]]
left ++
right--
}
};
```
### W3 half-loop
```
var reverseString = function(s) {
for(let low = 0; low < s.length/2; low++){
[s[low],s[s.length-low-1]] = [s[s.length-low-1],s[low]]
}
};
```
#### 時間複雜度: O(n/2)
#### 補充:
請比較一下 一半的迴圈跟 **每次動**兩格(雙指針) 的時間複雜度?
每次動n格,有點像每次都少掉一半,
(1/2)*(1/2)*(1/2)*(1/2)*...(1/2),乘n次,所以
是logn
### W4 遞迴
<!-- 這部分不太懂 之後需要再加強 -->
```
var reverseString = function(s) {
var helper = function(left, right){
if(left >= right)
return
[s[left], s[right]] = [s[right], s[left]]
return helper(left + 1, right - 1)
}
return helper(0, s.length - 1)
};
```
#### 優點
1. 簡單好懂
#### 缺點
1. 一層層呼叫記憶體,造成記憶體占用
#### 補充:
必須知道如何將遞迴和迴圈做轉換
###### tags: `Leetcode`