题目描述
对字符串中的所有单词进行倒排。
说明:
1、每个单词是以26个大写或小写英文字母构成;
2、’-‘做为单词连接符使用时,视为单词的一部分,例如“aa-bb”是一个单词;但连续出现2个’-’及以上时视为单词间隔符,如“aa--bb”中的“--”视为间隔符,是2个单词“aa”和“bb”;
3、非构成单词的字符均视为单词间隔符;
4、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
5、每个单词最长20个字母;
输入
字符串
输出
倒排的字符串
样例输入
I am a--student
样例输出
student a am I
提示
地区
深圳研究所
public void wordReverseSort(){
Scanner sc=new Scanner(System.in);
String input=sc.nextLine();
StringBuilder sb=new StringBuilder();
char[] c=input.toCharArray();
Stack<Character> stack=new Stack<Character>();
int count=0;//记录'-'连续出现的个数
for(int i=c.length-1;i>=0;i--){//对含有'-'的输入字符串进行处理
if(c[i]==45){
if(stack.peek()==45){
count++;
}else{
stack.push(c[i]);
count=1;
}
}else{
if(!stack.isEmpty()&&stack.peek()==45&&count>1){
stack.pop();
stack.push(',');
count=0;
}
stack.push(c[i]);
}
}
Stack<Character> stack2=new Stack<Character>();
while(!stack.isEmpty()){//对含有其他非字母的字符的输入字符串进行处理
char cc=stack.pop();
if(cc>122||cc<65||(90<cc&&cc<97)){
if(cc!=45){
stack2.push(',');
}else{
stack2.push(cc);
}
}else{
stack2.push(cc);
}
}
stack.clear();
while(!stack2.isEmpty()){
stack.push(stack2.pop());
}
while(!stack.isEmpty()){
sb.append(stack.pop());
}
String str=sb.toString();
str=str.replaceAll(",", " ");//用' '替换掉所有',';
String[] output=str.split(" ");
Stack<String> stack3=new Stack<String>();
for(int i=0;i<output.length;i++){
if(!output[i].trim().equals("")){//倒排转换后只允许出现一个空格间隔符;
if(output[i].trim().length()>20){
System.out.println("错误:存在长度超过20个字母的单词!");
return;
}
stack3.push(output[i]);
}
}
sb.delete(0, sb.length());
while(!stack3.isEmpty()){
sb.append(stack3.pop()+" ");
}
sb.deleteCharAt(sb.length()-1);
System.out.println(sb.toString());
}