LeetCode - 344. Reverse String 反转字符串
解题目标:给定一个字母列表,返回这个字母列表的倒序列表
解题思路:因为这道题要求只能改动输入的数组原地操作,个人采用的是双指针的写法,对称的位置互换元素。
class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
while (left < right) {
char temp = s[right];
s[right--] = s[left];
s[left++] = temp;
}
}
}
LeetCode - 541. Reverse String II 反转字符串 II
解题目标:给定一个字符串和正整数k,每2k个字符反转前k个字符,如果最后不够2k个且不够前k个就剩下的都反转,如果够前k个就反转前k个。
解题思路:这题的题目规则似乎很复杂,需要抓取其中的特定规律就可以简化代码,其实就是最好尾部能否凑足k个元素的不同操作的区别只需在每2k个区间内判断是否够k个元素来进行不同区间的反转。反转的逻辑和344题是一样的,但需要注意charArray转回String的时候需要new String()而不能直接return charArray.toString(),否则返回的是地址。
注意事项:这里要注意的是临界值判断的问题,这里反转区间统一采用左闭右开区间,在够k个的情况是小于等于的,因为去掉等于的情况就相当于跳过了最后末尾刚好够k个的情况。
class Solution {
public String reverseStr(String s, int k) {
for (int i = 0; i < s.length(); i += 2 * k) {
//够k个的情况
if (i+k <= s.length()) {
s = reverse(s, i, i+k);
} else {
//不够k个的情况
s = reverse(s, i, s.length());
}
}
return s;
}
//helper function
private String reverse(String s, int start, int end) {
int left = start;
int right = end - 1;
char[] arr = s.toCharArray();
while (left < right) {
char temp = arr[left];
arr[left++] = arr[right];
arr[right--] = temp;
}
return new String(arr);
}
}