題目描述
編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組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 奇數長度 ,這裏我們假設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。