第3天 字符串(简单)

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成”%20”。

示例 1:

1
2
输入:s = "We are happy."
输出:"We%20are%20happy."

限制:

1
0 <= s 的长度 <= 10000

题解

字符数组

需要声明一个3倍长的字符数组, 以防止全是空格的情况
使用charAt()方法按字符遍历原字符串,当遇到空格时,就使用%20来替换空格即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public String replaceSpace(String s) {
if(s.equals("")) return s;
int len = s.length();
char[] result = new char[len * 3];
int resultSize = 0;
for(int i = 0; i < len; i++){
if(s.charAt(i) == ' '){
result[resultSize++] = '%';
result[resultSize++] = '2';
result[resultSize++] = '0';
}else{
result[resultSize++] = s.charAt(i);
}
}
return new String(result, 0, resultSize);
}
}

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

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串”abcdefg”和数字2,该函数将返回左旋转两位得到的结果”cdefgab”。

示例 1:

1
2
输入: s = "abcdefg", k = 2
输出: "cdefgab"

示例 2:
1
2
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"

限制:

1
1 <= k < s.length <= 10000

题解

思路一

沿用上题字符数组的思路:

  1. 从k开始,复制后半段;
  2. 从0开始,复制前半段.
1
2
3
4
5
6
7
8
9
10
11
class Solution {
public String reverseLeftWords(String s, int n) {
char[] str = new char[s.length()];
int size = 0;
for(int i = n; i < s.length(); i++)
str[size++] = s.charAt(i);
for(int j = 0; j < n; j++)
str[size++] = s.charAt(j);
return new String(str, 0, s.length());
}
}

思路二

使用substring()方法进行字符串切割和重组

1
2
3
4
5
6
7
class Solution {
public String reverseLeftWords(String s, int n) {
String str1 = s.substring(0, n);
String str2 = s.substring(n);
return str2 + str1;
}
}