LeetCode 344: 反转字符串
⭕️ 解题思路:
(1)字符串类型题中比较基础的题型,可以利用Java中自带的一些类函数直接完成反转
(2)此处通过创建双指针,遍历字符串数组,然后创建一个临时变量,完成对应位置的字符交换
class Solution {
public void reverseString(char[] s) {
//遍历字符串数组
int left = 0;
int right = s.length - 1;
while(left < right){
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
LeetCode 541: 反转字符串 II
⭕️ 解题思路:
(1)先对出先的几种情况分析:
//以下默认字符串的长度为len
- 当 len <= k时,反转整个字符串
- 当 k < len <= 2*k时,先反转前 k 个,再考虑后面的剩余部分子串
(2)设计一个交换对应字符的方法,有两种方法
- 通过StringBuffer类来完成子串的反转
public static StringBuffer reversePart(StringBuffer sb, int l, int r){
while(l < r){
char temp = sb.charAt(l);
sb.setCharAt(l, sb.charAt(r));
sb.setCharAt(r, temp);
l++;
r--;
}
return sb;
}
- 通过字符串数组来完成子串的反转
- 字符串转化为字符数组:
char [] ch = str.toCharArray();
public static void reversePart(char [] ch, int l, int r){
while(l < r){
char temp = ch[l];
ch[l] = ch[r];
ch[r] = temp;
l++;
r--;
}
}
通过运行测试发现,利用字符数组来完成字符串的反转会更快一些。
(3)本题的重点在于如何处理这个不同的边界问题。
通过for遍历字符串,传进的左边界为 i,有边界为 i + k 与 len中的那个小的值减一,每次循环控制 i += 2*k
class Solution {
public String reverseStr(String s, int k) {
char [] ch = s.toCharArray();
int len = s.length();
for(int i = 0; i < len; i += 2 * k){
reversePart(ch, i, Math.min(i + k, len) - 1);
}
return new String(ch);
}
public static void reversePart(char [] ch, int l, int r){
while(l < r){
char temp = ch[l];
ch[l] = ch[r];
ch[r] = temp;
l++;
r--;
}
}
}