TypeScript基礎(一)——交替合併字串

ChangShinMark發表於2024-11-10

TypeScript基礎(一)—— 交替合併字串

題設:輸入“abc”、“ef”,輸出“aebfc”。

1、第一次嘗試
function mergeAlternately(word1: string, word2: string): string {
    // 採用三元運算子
    let max_len = word1.length < word2.length ? word2.length : word1.length;
    // 字串直接拼接
    let cache_str = "";
    for (let i = 0; i < max_len; i++) {
        // 如果長度超出字串長度,則會得到undefined
        if (word1[i] != undefined) {
            cache_str += word1[i];
        }
        if (word2[i] != undefined) {
            cache_str += word2[i];
        }
    }
    return cache_str;
};
分析:

​ (1)執行時間和記憶體佔用略高,不太理想。

​ (2)可讀性略差。

2、第二次嘗試
function mergeAlternately(word1: string, word2: string): string {
    // 用內建函式Math.max替換
    // let max_len = word1.length < word2.length ? word2.length : word1.length;
    let max_len=Math.max(word1.length,word2.length);
    let cache_str = "";
    for (let i = 0; i < max_len; i++) {
        // 直接判斷長度
        // if (word1[i] != undefined) {
        if (i < word1.length) {
            cache_str += word1[i];
        }
        // if (word2[i] != undefined) {
        if (i < word2.length) {
            cache_str += word2[i];
        }
    }
    return cache_str;
};
分析:

​ (1)內建函式通常經過最佳化,效能上可能略優於手寫的三元運算子。

​ (2)word1[i]在每次索引時,都會進行一次查詢操作,會稍微影響效能,尤其是在迴圈中頻繁執行時。而i < word2.length不需要實際訪問索引。所以直接進行長度比較,相對於取值再比較更快。

3、較優解
function mergeAlternately(word1: string, word2: string): string {
    let index = 0  // 長度計數
    let str = ''
    // 使用while迴圈,如果有其中一個字串已經遍歷完畢,則停止
    while (word1[index]!=null && word2[index]!=null) {
        str += word1[index]+word2[index]  // 一次插入兩個值
        index++;  // 計數加一
    }
    // 判斷剩餘字串
    if (word1[index]) {
        // 將 word1 字串從指定的 index 開始到字串末尾的子字串追加到 str 變數中。
        str += word1.substring(index);
    } 
    else if (word2[index]) {
        str += word2.substring(index);
    } 
    return str
};
分析:

​ (1)一次性新增兩個字元,直到短字串結束,最佳化效率。

​ (2)使用substring直接新增剩餘字元,減少迴圈。

// 使用陣列
function mergeAlternately(word1: string, word2: string): string {
    let index = 0;
    let resultArray: string[] = [];
    
    while (word1[index] != null && word2[index] != null) {
        resultArray.push(word1[index]);
        resultArray.push(word2[index]);
        index++;
    }
    // 減少判斷
    resultArray.push(word1.substring(index));
    resultArray.push(word2.substring(index));
    
    return resultArray.join('');
}
分析:

​ (1)使用字元陣列而不是字串拼接,在面對長字串時效率更高。

​ (2)直接pash剩餘字元,並使用.join('')消除空字元,減少邏輯判斷。

相關文章