算法修煉之路—【字符串】Leetcode 344 反轉字符串

題目描述

編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組char[]的形式給出。

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

你可以假設數組中的所有字符都是ASCII碼錶中的可打印字符。

示例1:

輸入: arrC = [“h”, “e”, “l”, “l”, “o”]
輸出: [ “o”, , “l”, “l”, “e”, “h”]

示例2:

輸入: arrC = [“H”, “a”, “n”, “n”, “a”, “h”]
輸出: [“h”, “a”, “n”, “n”, “a”, “H”]

思路分析

難度是簡單 , 如果對鏈表類題目比較熟悉,基於數組的交換元素值就會比較得心應手。這道題我們需要反轉字符串,我們可以分兩種情況:

  1. 字符串數組長度爲奇數
  2. 字符串數組長度爲偶數

對於情況1 奇數長度 ,這裏我們假設len = 5,則下標交換對分別爲0->4, 1->3,這裏是i -> len-i-1,截止點位下標爲index = 2的點;

對於情況2 偶數長度 ,這裏我們假設len = 2,則下標交換對分別爲0->3, 1->2,這裏同**情況1 **,交換規則爲i -> len-i-1,當i進行到一半時截止;

這時我們可以直接總結出規律,將交換主題代碼放入for循環中,截至條件爲i < len>>1。當爲奇數時,len >> 1剛好在中心下標的前一元素交換後停止循環;當爲偶數時,len >> 1剛好在左半部分交換後停止循環,則這裏直接給出代碼有:

解題代碼

    public static char[] solution(char[] input) {
        if(input == null || input.length == 1) return input;
        
        int len = input.length;
        
        for(int i = 0; i < len>>1; i++){
            char tmpC = input[i];
            input[i] = input[len - i - 1];
            input[len - i - 1] = tmpC;
        }
        return input;
        
    }

複雜度分析

這裏我們設n爲輸入字符數組的長度;

時間複雜度: 我們對數組進行了len >> 1次訪問,即n/2,故時間複雜度爲O(n);
空間複雜度: 如題目要求,沒有使用額外輔助容器,空間複雜度爲O(1);

Github源碼

完整可運行文件請訪問GitHub

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章