【剑指Offer】翻转单词顺序VS左旋转字符串

题目一

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串”I am a student.”,则输出”student. a am I”。

实现

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
public String ReverseSentence(String str) {
if (str == null || str.length() < 1)
return "";

char[] result = str.toCharArray();
int start = 0;
int end = 0;

reverse(result, 0, result.length - 1);

while (end < result.length) {
if (result[end] == ' ') {
reverse(result, start, end - 1);
start = ++end;
}
else if (end == result.length - 1)
reverse(result, start, end++);
else
end++;
}

return String.valueOf(result);
}

private void reverse(char[] result, int start, int end) {
while (start < end) {
char tmp = result[start];
result[start] = result[end];
result[end] = tmp;
start++;
end--;
}
}

题目二

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

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public String LeftRotateString(String str, int n) {
if (str == null || str.length() < n)
return "";

char[] result = str.toCharArray();
reverse(result, 0, n - 1);
reverse(result, n, result.length - 1);
reverse(result, 0, result.length - 1);

return String.valueOf(result);
}

private void reverse(char[] result, int start, int end) {
while (start < end) {
char tmp = result[start];
result[start] = result[end];
result[end] = tmp;
start++;
end--;
}
}