刷题中【单词倒排】

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 刷题中【单词倒排】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

题目描述

对字符串中的所有单词进行倒排

输入描述

输入一行以空格来分隔的句子
说明:

  • 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包中,使用BufferedReaderreadLine()方法必须处理java.io.IOException异常; Scanner位于java.util包中
努力做个总结

.当进行大量读入操作,或者输入的内容中间包括空格时,可以考虑使用BufferedReader类取得输入(Scanner空格比较敏感)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135487.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!