#LeetCode 344. Reverse String
双指针操作,比较简单。
class Solution {
public void reverseString(char[] s) {
if (s.length == 0) {
return;
}
for (int i = 0, j = s.length - 1; i < s.length / 2; i++, j--) {
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
return;
}
}
#LeetCode 541. Reverse String II
#LeetCode 541. 视频讲解:字符串操作进阶! | LeetCode:541. 反转字符串II_哔哩哔哩_bilibili
如果需要多次更改字符串的内容,一般使用StringBuilder 或 StringBuffer 类,所以本题可以用StringBuffer 建立一个新的字符串,用append 拼接的方式,这个方法细节较多。还可以考虑将字符串更改为数组,然后遍历的方式。
考虑的点在以2*k 为单位移动,每次操作的反转的字符串是前k 个。在分离出的2*k 个元素中,使用双指针法交换对应元素。如果剩余元素不足k 个,则end 指针指向数组最后一个元素。除了使用异或方法,还可以使用temp 临时变量更换两个元素。
遍历数组➕异或方法:
class Solution {
public String reverseStr(String s, int k) {
char[] result = s.toCharArray();
for(int i = 0; i < result.length; i += 2 * k) {
int start = i;
int end = Math.min(start + k - 1, result.length - 1);
while (start < end) {
result[start] ^= result[end];
result[end] ^= result[start];
result[start] ^= result[end];
start++;
end--;
}
}
return new String(result);
}
}
#LeetCode 151. Reverse Words in a String
#LeetCode 151. 视频讲解:字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili
解题思路:首先去除字符串中多余的空格 --> 翻转整个字符串 --> 翻转单词。
去除空格:双指针方法,如果快指针指向非空字符,慢指针不为0 ,则表示这是一个新单词,需要首先添加空格,当快指针没有超出字符串长度以及没有遇到空格时,持续更新在慢指针指向的位置中。最后需要用arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 将新数组复制出来保存,因为新数组与旧数组长度不同了,但数组长度在建立数组时已经设定,所以复制到新的数组中。
翻转数组 / 单词:使用三个参数,分别是:需要转换的数组,起始位置,终止位置(输入的终止位置不可以超过数组长度)。交换方法类似344 题,在翻转单词时,如果i 遍历到了数组尾部或者遇到了空格,即识别到了单词,开始交换。
字符串转换为数组方法: 空间复杂度O(1).
class Solution {
public String reverseWords(String s) {
char[] result = removeSpace(s);
reverseString(result, 0, result.length - 1);
reverseWord(result);
return new String(result);
}
public char[] removeSpace(String s) {
char[] string = s.toCharArray();
int fast = 0;
int slow = 0;
for (fast = 0; fast < string.length; fast++) {
if (string[fast] != ' ') {
if (slow != 0) {
string[slow++] = ' ';
}
while (fast < string.length && string[fast] != ' ') {
string[slow++] = string[fast++];
}
}
}
char[] newChars = new char[slow];
System.arraycopy(string, 0, newChars, 0, slow);
return newChars;
}
public void reverseString(char[] c, int left, int right) {
if (right >= c.length) {
return;
}
while (left < right) {
c[left] ^= c[right];
c[right] ^= c[left];
c[left] ^= c[right];
left++;
right--;
}
}
public void reverseWord(char[] c) {
int start = 0;
for (int i = 0; i <= c.length; i++) {
if (i == c.length || c[i] == ' ') {
reverseString(c, start, i - 1);
start = i + 1;
}
}
}
}