题目
题目描述:
输入一个英文文章片段,翻转指定区间的单词顺序,标点符号和普通字母一样处理。例如输入字符串“I am a developer.”,区间[0,3]则输出"developer. a am l"。
输入描述:
使用换行隔开三个参数
第一个参数为英文文章内容,即英文字符串
第二个参数为反转起始单词下标,下标从0开始
第三个参数为结束单词下标
输出描述:
反转后的英文文章片段,所有单词之间以—个半角空格分割进行输出
示例1
输入∶
l am a developer.
1
2
输出:
l a am developer.
示例2
输入∶
Hello world!
0
1
输出:
world! Hello
说明:
输入字符串可以在前面或者后面包含多余的空格,但是反转后的不能包含多余空格。
示例3
输入∶
I am a developer.
0
3
输出:
developer. a am l
说明:
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
示例4
输入:
Hello!
0
3
输出:
Hello!
说明:
指定反转区间只有一个单词,或无有效单词则统—输出原字符串。
思路
简单的字符处理题,可以利用栈的先入后出实现翻转,也可以利用双指针交换实现翻转
题解
java">package hwod;
import java.util.LinkedList;
import java.util.Scanner;
public class ReverseWord {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String content = sc.nextLine();
int start = sc.nextInt();
int end = sc.nextInt();
System.out.println(reverseWord(content, start, end));
System.out.println(reverseWord2(content, start, end));
}
//方案一:利用栈实现翻转
private static String reverseWord(String content, int start, int end) {
String[] arrs = content.trim().split("\\s+");
start = Math.max(0, start);
end = Math.min(arrs.length - 1, end);
if (start >= end) return content; //题目未明确要求,此分支不处理多余空格
LinkedList<String> stack = new LinkedList<>();
StringBuilder sb = new StringBuilder();
int i = 0;
while (i < arrs.length) {
if (i != 0) sb.append(" ");
if (i < start || i > end) {
sb.append(arrs[i]);
i++;
} else {
while (start <= i && i <= end) {
stack.addLast(arrs[i]);
i++;
}
while (!stack.isEmpty()) {
sb.append(stack.removeLast());
if (!stack.isEmpty()) sb.append(" ");
}
}
}
return sb.toString();
}
//方案二:双指针翻转
private static String reverseWord2(String content, int start, int end) {
String[] arrs = content.trim().split("\\s+");
start = Math.max(0, start);
end = Math.min(arrs.length - 1, end);
if (start >= end) return content; //题目未明确要求,此分支不处理多余空格
while (start < end) {
swap(arrs, start, end);
start++;
end--;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arrs.length; i++) {
if (i != 0) sb.append(" ");
sb.append(arrs[i]);
}
return sb.toString();
}
private static void swap(String[] arrs, int start, int end) {
String tmp = arrs[start];
arrs[start] = arrs[end];
arrs[end] = tmp;
}
}
推荐
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。