LeetCode 之 JavaScript 解答第344題 —— 反轉(zhuǎn)字符串(Reverse String)


Time:2019/4/18
Title: Reverse String
Difficulty: Easy
Author: 小鹿


題目:Reverse String(反轉(zhuǎn)字符串)

Write a function that reverses a string. The input string is given as an array of characters char[].

Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.

You may assume all the characters consist of printable ascii characters.

編寫一個(gè)函數(shù),其作用是將輸入的字符串反轉(zhuǎn)過來。輸入字符串以字符數(shù)組 char[] 的形式給出。

不要給另外的數(shù)組分配額外的空間,你必須原地修改輸入數(shù)組、使用 O(1) 的額外空間解決這一問題。

你可以假設(shè)數(shù)組中的所有字符都是 ASCII 碼表中的可打印字符。

Example 1:

Input: ["h","e","l","l","o"]
Output: ["o","l","l","e","h"]

Example 2:

Input: ["H","a","n","n","a","h"]
Output: ["h","a","n","n","a","H"]

Slove:

▉ 問題分析

1)反轉(zhuǎn)字符串,第一想到的就是將字符窗倒序存儲到數(shù)組中,可以先輸出,然后再 for 循環(huán)加入到數(shù)組中。題目中要求需要原地修改輸入數(shù)組,那么我們再想一個(gè)辦法。

2)數(shù)組中的操作,需要原地修改數(shù)組,第一想到的就是用到指針,為什么能想到用指針呢?當(dāng)你做這種數(shù)組的也好還是鏈表的也好,做多了之后,下意識的給出解決方法然后去看看可不可行。

▉ 算法思路

通過以上分析,得出兩種方法:

  • 字符串反轉(zhuǎn)法
  • 雙指針法

字符串反轉(zhuǎn)法:

1)字符串反轉(zhuǎn)法很簡單了,按照我們正常的思路走就可以了,首先輸出數(shù)組中的字符拼接成字符串。

2)然后從字符串尾部開始遍歷,正向輸入數(shù)組。

雙指針法:

1)定義兩個(gè)指針,分別指向字符串頭部和尾部。

2)兩個(gè)指針指向的值進(jìn)行交換。

3)注意終止條件。

  • 如果為偶數(shù),當(dāng)頭指針 - 1 等于尾指針時(shí),反轉(zhuǎn)完畢。
  • 如果為奇數(shù),當(dāng)兩個(gè)指針相等時(shí),反轉(zhuǎn)完畢。
▉ 測試用例

1)空字符串。

2)偶數(shù)個(gè)數(shù)的字符串。

3)奇數(shù)個(gè)數(shù)的字符串。

4)長度為 1 的字符串。

▉ 雙指針法
var reverseString = function(s) {
    //判斷輸入的字符串是否為空
   if(s.length ==0) return s;
    //定義兩個(gè)指針
    let low = 0;
    let high = s.length - 1;
    // 循環(huán)反轉(zhuǎn)字符
    while(true){
        // 分為奇數(shù)/偶數(shù)兩種可能
        if(low === high || high + 1 === low) break;
        let temp = s[low];
        s[low] = s[high];
        s[high] = temp;
        low++;
        high--;
    }
    // 返回反轉(zhuǎn)好的字符串
    return s;
};
▉ 字符串反轉(zhuǎn)法
var reverseString = function(s) {
    //判斷輸入的字符串是否為空
    if(s.length ==0) return s;
    let str = "";
    // 輸出字符串
    for(let i in s){
        str = str+`${s[i]}`;
    }
    // 反轉(zhuǎn)字符串輸入
    for(let i = s.length - 1,j = 0;i >= 0;i--,j++){
        s[j] = str.charAt(i);
    }
    //返回反轉(zhuǎn)好的字符串
    return s;
};
▉ 性能分析

字符串反轉(zhuǎn)法

  • 時(shí)間復(fù)雜度:O(n)。遍歷整個(gè)數(shù)組,時(shí)間復(fù)雜度為 O(n)。
  • 空間復(fù)雜度:O(n)。輸出數(shù)組需要額外的存儲空間,如果用數(shù)組存儲,需要開辟大小為 n 大小的內(nèi)存空間。如果需要數(shù)組輸出拼接字符串,空間復(fù)雜度為 O(1) 了。

雙指針法:

  • 時(shí)間復(fù)雜度:O(n)。需要遍歷 n/2 的數(shù)據(jù),時(shí)間復(fù)雜度為 O(n)。
  • 空間復(fù)雜度:O(n)。只需常量級別的內(nèi)存空間,空間復(fù)雜度為O(1)。
▉ 考查內(nèi)容

1)對字符串的基本操作。

2)數(shù)組的基本操作。



歡迎一起加入到 LeetCode 開源 Github 倉庫,可以向 me 提交您其他語言的代碼。在倉庫上堅(jiān)持和小伙伴們一起打卡,共同完善我們的開源小倉庫!
Github:https://github.com/luxiangqiang/JS-LeetCode
歡迎關(guān)注我個(gè)人公眾號:「一個(gè)不甘平凡的碼農(nóng)」,記錄了自己一路自學(xué)編程的故事。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,679評論 0 4
  • ??引用類型的值(對象)是引用類型的一個(gè)實(shí)例。 ??在 ECMAscript 中,引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)...
    霜天曉閱讀 1,219評論 0 1
  • 前言 2. 實(shí)現(xiàn) Singleton 3. 數(shù)組中重復(fù)的數(shù)字 4. 二維數(shù)組中的查找 5. 替換空格 6. 從尾到...
    Observer_____閱讀 3,159評論 0 1
  • 本文內(nèi)容為練習(xí)LeetCode題目時(shí)的解題思路和不同算法的記錄,實(shí)現(xiàn)語言為C++,代碼保存在Github,均已在L...
    SK木眠閱讀 1,121評論 0 0
  • 圖片來自網(wǎng)絡(luò) 有沒有一首歌,讓你單曲循環(huán)過?有沒有一個(gè)人,讓你念念不忘著?有沒有一首詩,你讀著讀著就哭了?下面七首...

友情鏈接更多精彩內(nèi)容