目录
344. 反转字符串
难度:easy
类型:双指针,字符串
思路:
题目很简单,可以通过双指针和位运算来实现交换。
对于位运算,这篇文章讲得不错:(62条消息) 通过位运算实现数值交换_位运算交换_我还能抢救一下的博客-CSDN博客
代码:
class Solution {
public void reverseString(char[] s) {
for (int i = 0; i < s.length / 2; i++) {
char tem = s[i];
s[i] = s[s.length - 1 - i];
s[s.length - 1 - i] = tem;
}
}
}
// 位运算
class Solution {
public void reverseString(char[] s) {
for (int i = 0; i < s.length / 2; i++) {
s[i] ^= s[s.length - 1 - i];
s[s.length - 1 - i] ^= s[i];
s[i] ^= s[s.length - 1 - i];
}
}
}
// 双指针
class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
while (left < right) {
char tem = s[left];
s[left] = s[right];
s[right] = tem;
left++;
right--;
}
}
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度: O(1)
541. 反转字符串 II
难度:easy
类型:字符串,双指针
思路:
题意是说每隔2k为一个翻转区间,每个区间里反转前k个元素。若不足2k个再单独讨论。
每2k个元素一个反转可通过for循环来实现,特殊情况代码如下:
int end = Math.min(i + k - 1, len - 1);
很机智的做法!
代码:
class Solution {
public String reverseStr(String s, int k) {
int len = s.length();
char[] c = s.toCharArray();
for (int i = 0; i < len; i += 2 * k) {
int end = Math.min(i + k - 1, len - 1);
reverseCharArray(c, i, end);
}
return new String(c);
}
// 反转字符串中的给定范围,左闭右闭
public char[] reverseCharArray(char[] c, int start, int end) {
while (start < end) {
char tem = c[start];
c[start] = c[end];
c[end] = tem;
start++;
end--;
}
return c;
}
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(1)
剑指 Offer 05. 替换空格
难度:easy
类型:双指针
思路:
两种方法:
1.StringBuilder:遍历字符串s的每个元素,利用StringBuilder,遇到空格就直接替换成“%20”进行拼接。
2.双指针:先遍历字符串,对字符串进行扩容,遇到一个空格则在字符串尾部增加两个空格。然后再用双指针进行操作,left指针指向原字符串尾部,right指针指向扩容后的字符串尾部。扩容从尾部到头部,left从尾部向头部遍历,遇到字母就放到right指向的位置(right--),遇到空格则在right指向位置存入%20。(若从头部进行,则每替换一个空格,其后面的元素都要后移。)
代码:
// 利用StringBuilder进行操作
class Solution {
public String replaceSpace(String s) {
if (s == null || s.length() == 0) {
return s;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) != ' ') {
sb.append(s.charAt(i));
} else {
sb.append("%20");
}
}
return sb.toString();
}
}
// 双指针法
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度: O(1)
151.翻转字符串里的单词
难度:medium
类型:字符串,双指针
思路:
解题思路如下:
- 移除多余空格
- 将整个字符串反转
- 将每个单词反转
举个例子,源字符串为:"the sky is blue "
- 移除多余空格 : "the sky is blue"
- 字符串反转:"eulb si yks eht"
- 单词反转:"blue is sky the"
代码:
复杂度分析:
- 时间复杂度:
- 空间复杂度:
剑指 Offer 58 - II. 左旋转字符串
难度:easy
类型:字符串,双指针
思路:
先将[0,k-1]和[k,s.length()-1]分别反转,再反转整个字符串 ;
例如,对于示例1:
初始s: "abcdefg"
反转区间:"ba gfedc"
整体翻转:"cdefg ab"
代码:
// 先将[0,k-1]和[k,s.length()-1]分别反转,再反转整个字符串
class Solution {
public String reverseLeftWords(String s, int n) {
char[] c = s.toCharArray();
reverseMethod(c, 0, n - 1);
reverseMethod(c, n, c.length - 1);
reverseMethod(c, 0,c.length - 1);
// return String.valueOf(c);
return new String(c);
}
// 左闭右闭
public char[] reverseMethod(char[] c, int start, int end) {
while (start < end) {
char tem = c[start];
c[start] = c[end];
c[end] = tem;
start++;
end--;
}
return c;
}
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(1)