我新建的个人博客,欢迎访问:hmilzy.github.io


344. 反转字符串

题目链接: 反转字符串

没什么好说的,左右指针往中间走就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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--;
}

}
}

541. 反转字符串 II

题目链接: 反转字符串 II

自定义一个函数reverse,实现对字符数组任意区间的字符进行反转。
主函数中for循环 i += 2*k ,判断剩余长度大小,执行不同区间的reverse。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public String reverseStr(String s, int k) {

char[] ch = s.toCharArray();

for(int i = 0; i < ch.length; i += (2 * k)) {
if(i + k <= ch.length) {
reverse(ch,i,i + k - 1);
}else{
reverse(ch,i,ch.length - 1);
}
}
return new String(ch);

}

public static void reverse(char[] ch,int begin,int end){
int left = begin;
int right = end;
while(left <= right){
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
}

剑指Offer 05.替换空格

题目链接: 替换空格

用StringBuilder更改字符串,append添加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public String replaceSpace(String s) {

StringBuilder result = new StringBuilder();

for(int i = 0; i < s.length(); i++){
if(s.charAt(i) == ' '){
result.append("%20");
}else{
result.append(s.charAt(i));
}
}

return result.toString();
}
}

151. 反转字符串中的单词

题目链接: 反转字符串中的单词

这道题我想的思路是
1.用trim去掉头尾空格。
2.用split(“ “)将字符串分为字符串数组。
3.反转字符串数组。
4.中间加空格。

但是这里有个问题是,如果字符串s中间有两个空格,应该怎么办。
这种情况可以用split(“\s+”)。但是空间复杂度可能比较高喔,没有达到原地反转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public String reverseWords(String s) {

String[] str = s.trim().split("\\s+");
int left = 0;
int right = str.length - 1;
while(left <= right) {
String temp = str[left];
str[left] = str[right];
str[right] = temp;
left++;
right--;
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < str.length; i++) {
if(i == str.length - 1){
sb.append(str[i]);
}else{
sb.append(str[i] + " ");
}
}
return sb.toString();
}
}

第二种方法:原地反转
1.移除首尾和中间的多余空格
2.反转整个字符串
3.将每个单词自己反转
见如下代码:需要仔细看!比较巧妙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class Solution {
public String reverseWords(String s) {

StringBuilder sb = removeSpace(s);
reverseString(sb,0,sb.length() - 1);
reverseEachWord(sb);
return sb.toString();

}
//去除空格
public StringBuilder removeSpace(String s){

int start = 0;
int end = s.length()-1;
while(s.charAt(start) == ' '){
start++;
}
while(s.charAt(end) == ' '){
end--;
}
StringBuilder sb = new StringBuilder();
while(start <= end){
char c = s.charAt(start);
//去除各单词中间[多余]的空格
if(s.charAt(start) != ' ' || sb.charAt(sb.length() - 1) != ' '){
sb.append(c);
}
start++;
}
return sb;
}

//反转字符串
private void reverseString(StringBuilder sb,int start,int end){
char temp;
while(start < end){
temp = sb.charAt(start);
sb.setCharAt(start,sb.charAt(end));
sb.setCharAt(end,temp);
start++;
end--;
}
}

//反转单词
private void reverseEachWord(StringBuilder sb){
int start = 0;
int end = 1;
while(start < sb.length()){
while(end < sb.length() && sb.charAt(end) != ' '){
end++;
}
reverseString(sb,start,end - 1);
start = end + 1;
end = start + 1;
}
}
}

剑指 Offer 58 - II. 左旋转字符串

题目链接: 左旋转字符串

先将后面的字符加入。再将前面的字符加入。但是好像复杂度不太行,需要改进。

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder result = new StringBuilder();
for(int i = n; i < s.length(); i++){
result.append(s.charAt(i));
}
for(int i = 0; i < n; i++){
result.append(s.charAt(i));
}
return result.toString();
}
}