【LeetCode_344】反轉字串_Python&Java_雙指標解法
參考部分,如有侵權,請聯絡刪除。
編寫一個函式,其作用是將輸入的字串反轉過來。輸入字串以字元陣列 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,一方面記錄方便自己學習,另一方面給需要的同伴參考。雖然失敗並不可怕,但是也希望同伴們少踩一些坑。分析演算法挺費勁的,留個贊或評論支援一下博主吧!同時我也非常希望寫出更通俗易懂的文章,知識尚淺,如有遺漏或錯誤,歡迎指正~
相關文章
- 力扣之反轉字串之原地修改輸入陣列(雙指標方式)力扣字串陣列指標
- 力扣之僅僅反轉字母(雙指標方式)力扣指標
- 實現反轉連結串列--遞迴、迭代、雙指標、棧遞迴指標
- 雙指標指標
- 字串指標與字元陣列 (轉)字串指標字元陣列
- 雙指標法指標
- 力扣之x的平方根(雙指標解法思路分析最佳化)力扣指標
- 反轉字串字串
- 字串反轉字串
- C語言 將字串按照指定字元分離並且反轉(三級指標)列子C語言字串字元指標
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- 指標與字串排序指標字串排序
- Delphi字串指標操作字串指標
- 反轉字串(JavaScript)字串JavaScript
- 華為-字串反轉字串
- JavaScript 字串反轉JavaScript字串
- 雙指標(下標)的應用指標
- 演算法-雙指標演算法指標
- c指標之字串常量指標字串
- 438. 找到字串中所有字母異位詞(暴力,雙指標)2字串指標
- LeetCode -844. 比較含退格的字串(棧、雙指標)LeetCode字串指標
- 藍橋杯-遞增三元組(三種解法,二分, 雙指標, 字首和)指標
- 指標 (轉)指標
- 雙指標法相關的題指標
- 滑動視窗與雙指標指標
- 雙指標維護筆記指標筆記
- C語言之字串與指標C語言字串指標
- 通達信強烈反轉主圖指標公式原始碼指標公式原始碼
- lc 763.劃分字母區間(字串,雙指標)【***貪心演算法】字串指標演算法
- 字串或數字反轉字串
- C語言知識彙總 | 51-C語言字串指標(指向字串的指標)C語言字串指標
- 雙指標相關演算法指標演算法
- 6.12.雙指標專題指標
- 雙指標習題:Kalindrome Array指標
- 雙指標妙解三數之和指標
- 指標陣列練習排列字串指標陣列字串
- Day7(字串)|344.反轉字串 541.反轉字串II 54.替換數字字串
- 將一個字串進行反轉:將字串中指定部分進行反轉。比如“abcdefg”反轉為”abfedcg”字串