344.反转字符串
题目链接
思路:
1.本题要求用O(1)的空间修改字符串数组,原地修改
2.使用双指针即可,两两原地交换
class Solution {
public void reverseString(char[] s) {
if (s.length == 0 || s == null) {
return;
}
int left = 0;
int right = s.length - 1;
while (left < right) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
541. 反转字符串II
题目链接
思路:
1.本题在I的基础上难度增加,类似于翻转指定区间,但是每隔2k距离翻转前k个
2.用一个for循环来以2k的距离增加,start和end来固定交换区间
3.注意end的取值**int end = Math.min(start + k - 1, ch.length - 1);**
和最后一个元素的位置比较是为了满足题目的条件,如果剩余字符小于k个,end就会取**ch.length - 1**
将剩余的全部翻转,否则翻转前k个
4.两两交换元素的方式不止使用temp变量,也可以使用异或操作,简单高效,不需要额外变量
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i += 2*k) {
int start = i;
int end = Math.min(start + k - 1, ch.length - 1);
while (start < end) {
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
return new String(ch);
}
}
剑指Offer 05.替换空格
方式一:直接掉API
思路:
1.使用Java提供的操作字符串的方法replaceAll()
class Solution {
public String replaceSpace(String s) {
return s.replaceAll(" ","%20");
}
}
方式二:常规遍历
思路:
1.遍历字符串即可,遇到空格替换为%20
2.使用StringBuilder来进行新字符串的拼接,遇到空格,拼接%20
3.不是空格则拼接原字符
4.字符串的比较注意使用equals()
方法
class Solution {
public String replaceSpace(String s) {
if (s == null) {
return null;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (" ".equals(String.valueOf(s.charAt(i)))) {
sb.append("%20");
} else {
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}
151.翻转字符串里的单词
题目链接
思路:
1.首先用split()
方法将字符串以空格分割成字符串数组
2.倒序遍历数组,从最后依次将字符加入字符串
3.如果遇到空格直接跳过
4.注意最后返回要截取0,length-1因为最后会有一个""
为什么要和**""**
比较而不是和**" "**
比较,在进行debug后,发现前面每多一个空格,分割为字符串后就会多一个空串**""**
class Solution {
public String reverseWords(String s) {
String[] str = s.split(" ");
String res = "";
for (int i = str.length - 1; i >= 0; i--) {
if (str[i].equals("")) {
continue;
} else {
res += str[i];
res += " ";
}
}
return " ".equals(res) ? " " : res.substring(0, res.length() - 1);
}
}
剑指Offer58-II.左旋转字符串
方法一:拼接
这种方法不是原地反转
class Solution {
public static String reverseLeftWords(String s, int n) {
String res = "";
String s1 = s.substring(0, n);
String s2 = s.substring(n, s.length());
res = s2 + s1;
return res;
}
}
方法二:局部反转和整体翻转
解题具体思路见代码随想录
先反转整体再翻转局部
class Solution {
public String reverseLeftWords(String s, int n) {
char[] c = s.toCharArray();
reverse(c, 0, c.length - 1);
reverse(c, 0, c.length - 1 - n);
reverse(c, c.length - n, c.length - 1);
return new String(c);
}
public void reverse(char[] c, int left, int right) {
while (left < right) {
c[left] ^= c[right];
c[right] ^= c[left];
c[left] ^= c[right];
left++;
right--;
}
}
}
先反转局部再翻转整体
class Solution {
public String reverseLeftWords(String s, int n) {
char[] c = s.toCharArray();
reverse(c, 0, n - 1);
reverse(c, n, c.length - 1);
reverse(c, 0, c.length - 1);
return new String(c);
}
public void reverse(char[] c, int left, int right) {
while (left < right) {
c[left] ^= c[right];
c[right] ^= c[left];
c[left] ^= c[right];
left++;
right--;
}
}
}