题目一344. 反转字符串 - 力扣(LeetCode)
思路:
要求原地修改数组,不能新建一个数组来遍历
方法:利用left 和 right 双指针遍历
- 通过数值交换,定义tmp
int tmp = s[i];
s[i] = s[j];
s[j] = tmp;
- 通过位运算交换,不用额外空间
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];
代码
- 这里的字符串s是char[]格式
- 没有返回值
class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length -1;
while(left < right) {
s[left] ^= s[right];
s[right] ^= s[left];
s[left] ^= s[right];
left++;
right--;
}
}
}
题目二541. 反转字符串 II - 力扣(LeetCode)
思路
指针i步长为2k,判断i+k <= length -1是否满足
- 若满足
reverse(chs,i,i+k-1); - 若不满足
reverse(chs,i,chs.length - 1);
代码
- 字符串-->字符数组:
char[] chs = s.toCharArray(); - 字符数组-->字符串:
new String(chs)
class Solution {
public String reverseStr(String s, int k) {
int i = 0;
char[] chs = s.toCharArray();
while(i < chs.length) {
if((i+k) < chs.length){
reverse(chs,i,i+k-1);
}else{
reverse(chs,i,chs.length - 1);
}
i += 2*k;
}
return new String(chs);
}
public void reverse(char[] s,int a,int b) {
int i = a;
int j = b;
while(i < j) {
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];
i++;
j--;
}
}
}
题目三151. 反转字符串中的单词 - 力扣(LeetCode)
思路
1、 先用一个函数removeBlank()来移除字符串的多余空格,只保留每个单词最前面的空格(首字母除外)
2、 用reverse(chs,start,end)来反转字符数组的某一部分
3、 首先反转整个字符串
4、 反转每个单词,遍历到不是空格的时候,循环i++,记录单词结尾位置
代码
class Solution {
public String reverseWords(String s) {
// System.out.println(removeBlank(s));
char[] chs = removeBlank(s).toCharArray();
reverse(chs,0,chs.length-1);
// System.out.println(new String(chs));
for(int i = 0;i<chs.length;i++) {
if(chs[i] != ' ') {
int start = i;
while(i < chs.length && chs[i] != ' ') {
i++;
}
reverse(chs,start,i-1);
}
}
return new String(chs);
}
public void reverse(char[] ch, int start, int end) {
// 反转部分字符
int i = start;
int j = end;
while(i < j) {
char tmp;
tmp = ch[i];
ch[i] = ch[j];
ch[j] = tmp;
i++;
j--;
}
}
public String removeBlank(String s) {
char[] chs = s.toCharArray();
// char[] newchs;
int j = 0;
for(int i = 0;i < chs.length;i++) {
if(chs[i] != ' ') {
if(j != 0) {
chs[j] = ' ';
j++;
}
while(i < chs.length && chs[i] != ' ') {
chs[j] = chs[i];
i++;
j++;
}
}
}
return new String(chs,0,j);
}
}
学习时间:20min