题目描述
对字符串中的所有单词进行倒排
输入描述
输入一行以空格来分隔的句子
说明:
- 1.每个单词是以26个大写或小写英文字母构成;
- 2.非构成单词的字符均视为单词间隔符;
- 3.要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
输出描述
输出句子的逆序
示例
输入
edqwa3 4h$ km;k
输出
k km h edqwa
代码实现
方法一
/* 思路:
* 1.获取单词,以非字母字符分割
* 2.倒序遍历,存入新字符串中
*
* 运行时间:18ms
* 占用内存:9436k
*/
public static void m1() throws IOException {
BufferedReader sc =new BufferedReader(new InputStreamReader(System.in));
String s="";
s=sc.readLine();
StringBuffer br=new StringBuffer();
String[] sArr=s.split("[^a-zA-Z]+"); // + 表示匹配一个或多个(至少一个,相当于{1,})
for(int i=sArr.length-1;i>=0;i--) {
br.append(sArr[i]+" ");
}
System.out.println(br.toString().trim());
}
方法二
/* 思路:
* 1.获取单词,将非字母字符替换为空格
* 2.以空格分割字符串存入数组
* 3.倒序遍历,将不为空的字符存入新字符串中
*
* 运行时间:17ms
* 占用内存:9448k
*/
public static void m2() throws IOException{
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
String s=br.readLine();
StringBuffer sb=new StringBuffer();
for(int i=0;i<s.length();i++) {
char c=s.charAt(i);
if((c>='a' && c<='z')||(c>='A' &&c<='Z')) {
sb.append(c);
}else {
sb.append(' ');
}
}
String[] sArr=sb.toString().trim().split("\\s+");
StringBuffer sb2=new StringBuffer();
for(int j=sArr.length-1;j>=0;j--) {
if(!(sArr[j].equals(" "))) {
sb2.append(sArr[j]);
}
if(j>0) {
sb2.append(" "); //最后一个不用加
}
}
System.out.println(sb2.toString());
}
题目知识点总结
正则表达式
\s
-> 匹配任何1个空白字符(包括空格、制表符、换页符……等价于->\f\n\r\t\v
)
\f
-> 匹配 1 个换页符
\n
-> 匹配 1 个换行符
\r
-> 匹配 1 个回车符
\t
-> 匹配 1 个制表符
\v
-> 匹配 1 个垂直制表符
+
-> 匹配 1 个或多个({1, })
?
-> 匹配 0 个或 1 个({0,1})
\
-> 转义
\s+
-> 匹配任意多个上面的字符
[^a-zA-Z]
-> 匹配 1 个非字母
[^a-zA-Z]+
-> 匹配 1 个或多个非字母
^[a-zA-Z]
-> 匹配 1 个大小写字母
^[a-zA-Z]+
-> 匹配 1 个或多个大小写字母
(c>=‘a’ && c<=‘z’)||(c>=‘A’ && c<=‘Z’)
等价于Character.isLowerCase(c)||Character.isUpperCase(c)
->判断是否为大小写字母
\d
-> 匹配 1 个数字(判断是否为数字 -> Character.isDigit()
)
-?\d+
-> 匹配任意个正负数
Scanner和BufferedReader
相同
- 都可以获取键盘输入的内容
不同
Scanner
是一个简单的文本扫描器;BufferedReader
是一个缓冲字符输入流(缓冲区大小可设置)BufferedReader
只将回车看作输入结束;而Scanner
把回车 空格 tab 都看作输入结束(指使用next()
方法时,使用nextLine()
方法也是只将回车看作输入结束)BufferedReader
会缓冲读入的字符,比Scanner
更高效BufferedReader
位于java.io
包中,使用BufferedReader
的readLine()
方法必须处理java.io.IOException
异常;Scanner
位于java.util
包中
努力做个总结
.当进行大量读入操作,或者输入的内容中间包括空格时,可以考虑使用BufferedReader
类取得输入(Scanner
对空格比较敏感)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135487.html