題目1
力扣 344題, 反轉字符串
編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 s 的形式給出。
不要給另外的數組分配額外的空間,你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。
示例 1:
輸入:s = ["h","e","l","l","o"]
輸出:["o","l","l","e","h"]
示例 2:
輸入:s = ["H","a","n","n","a","h"]
輸出:["h","a","n","n","a","H"]
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/reverse-string
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
解法:雙指針
class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length-1;
while(left < right){
char t = s[left];
s[left] = s[right];
s[right] = t;
left++;
right--;
}
}
}
題目2
力扣 541題 反轉字符串II
給定一個字符串 s 和一個整數 k,從字符串開頭算起,每計數至 2k 個字符,就反轉這 2k 字符中的前 k 個字符。
如果剩餘字符少於 k 個,則將剩餘字符全部反轉。
如果剩餘字符小於 2k 但大於或等於 k 個,則反轉前 k 個字符,其餘字符保持原樣。
示例 1:
輸入:s = "abcdefg", k = 2
輸出:"bacdfeg"
示例 2:
輸入:s = "abcd", k = 2
輸出:"bacd"
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/reverse-string-ii
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
解法:雙指針
class Solution {
public String reverseStr(String s, int k) {
char[] chars = s.toCharArray();
int length = chars.length;
for(int i = 0; i*k < length; i++){
if(i%2 == 0){
int end = i*k+k-1;
if (i*k+k-1 >= length){
end = length-1;
}
reverseArray(chars, i*k, end);
}
}
return new String(chars);
}
// 反轉數組區間
public void reverseArray(char[] chars, int start, int end) {
int offset = 0;
for(int i = start; i <= (start+end)/2; i++){
char tmp = chars[start + offset];
chars[start + offset] = chars[end - offset];
chars[end - offset] = tmp;
offset++;
}
}
}