题目:
翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出“student. a am I”。
分析:
第一步,对整句话翻转,“I am a student.”翻转得到“.tneduts a ma I”。
第二步,对每个单词进行翻转,也就得到了“student. a am I”。
解法:
package com.wsy;
public class Main {
public static char[] chars;
public static void main(String[] args) {
chars = "I am a student.".toCharArray();
int length = chars.length;
int start = 0, end = length - 1;
reverse(start, end);
for (start = 0, end = 0; start < length; ) {
if (chars[start] == ' ') {
start++;
end++;
} else if (end == length - 1 || chars[end] == ' ') {
if (end == length - 1) {
reverse(start, end);
break;
} else {
reverse(start, --end);
start = ++end;
}
} else {
end++;
}
}
for (int i = 0; i < length; i++) {
System.out.print(chars[i]);
}
}
public static void reverse(int start, int end) {
while (start < end) {
char temp = chars[start];
chars[start] = chars[end];
chars[end] = temp;
start++;
end--;
}
}
}
题目:
左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串“abcdefg”和数字2,该函数将返回左旋转两位得到的结果“cdefgab”。
分析:
可以利用第一个题的方法,将字符串整体翻转一次,再对分割点两侧做一下翻转,就可以实现了,需要注意的是输入的n,可能超过字符串的长度,所以需要对n取模。
也可以直接在分割点将字符串分开,然后调换前后位置拼接起来。
解法:
package com.wsy;
public class Main {
public static char[] chars;
public static void main(String[] args) {
chars = "abcdefg".toCharArray();
int length = chars.length;
int n = 0;
n %= length;
if (n < 0) {
return;
}
reverse(0, n - 1);
reverse(n, length - 1);
reverse(0, length - 1);
for (int i = 0; i < length; i++) {
System.out.print(chars[i]);
}
}
public static void reverse(int start, int end) {
while (start < end) {
char temp = chars[start];
chars[start] = chars[end];
chars[end] = temp;
start++;
end--;
}
}
}