I.
編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 s 的形式給出。
不要給另外的數組分配額外的空間,你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。
class Solution {public void reverseString(char[] s) {int i = 0, j = s.length - 1;while (i < j) {char temp = s[i];s[i] = s[j];s[j] = temp;i++;j--;}}
}
時間復雜度:O(n)
空間復雜度:O(1)
II.
給定一個字符串 s 和一個整數 k,從字符串開頭算起,每計數至 2k 個字符,就反轉這 2k 字符中的前 k 個字符。
如果剩余字符少于 k 個,則將剩余字符全部反轉。
如果剩余字符小于 2k 但大于或等于 k 個,則反轉前 k 個字符,其余字符保持原樣。
class Solution {public String reverseStr(String s, int k) {// 將字符串轉換為字符數組,以便可以修改字符char[] arr = s.toCharArray();// 每次處理2k個字符,所以i每次增加2kfor (int i = 0; i < arr.length; i += 2 * k) {// 反轉前k個字符int left = i;int right = Math.min(i + k - 1, arr.length - 1);while (left < right) {char temp = arr[left];arr[left] = arr[right];arr[right] = temp;left++;right--;}}return new String(arr);}
}
時間復雜度: O(n),其中 n 是字符串的長度,因為我們只遍歷了一次字符串,并在每次處理時執行常數時間的反轉操作。
空間復雜度: O(n),用于存儲字符數組。
III.
給定一個字符串 s ,你需要反轉字符串中每個單詞的字符順序,同時仍保留空格和單詞的初始順序。
class Solution {public String reverseWords(String s) {char[] arr = s.toCharArray();int left = 0;for (int i = 0; i < arr.length; i++) {if (arr[i] == ' ') {reverse(arr, left, i - 1);left = i + 1;}if (i == arr.length - 1) {reverse(arr, left, i);}}return new String(arr);}public void reverse(char[] arr, int left, int right) {while (left < right) {char temp = arr[left];arr[left] = arr[right];arr[right] = temp;left++;right--;}}
}
時間復雜度: O(n),其中 n 是字符串的長度。我們只遍歷了字符數組一次,并在遍歷過程中執行了常數時間的反轉操作。
空間復雜度: O(n),用于存儲字符數組 arr,以及 new String(arr)。