蓝桥杯练习题9
问题描述如下:
小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob有多少次同时出现。
更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:在小说文本中 Alice 和 Bob 之间不超过 K 个字符。
例如以下文本:
This is a story about Alice and Bob. Alice wants to send a private message to Bob.
假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是”Alice and Bob”和”Bob. Alice”。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。
注意:
- Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。
- Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能
有字母。例如 Bobbi 並不算出现了 Bob。
思路:
由于对String类方法有一些遗忘,于是对这个方法重新学习了一下。
分割方法:split()
public String[] split(String regex)根据给定的正则表达式的匹配来拆分此字符串。
1.正则表达式的含义:\\s 空格回车,换行等空白符。
2.+号表示一个或多个的意思
3.要使用".“分割,必须使用\转义:如:split(”\\.");
一:需要创建两个数组,
一个是字符型数组存储英文单词,另一个是数值型数组,主要用来存储英文单词长度。
二:将键盘录入的英文语句按照空格和.符号进行分割,将分割出来的英文单词存进words字符型数组中去。
三:循环遍历words字符串数组,并将每个字符串长度值存储在数值型数组中。
四:计算Alice–Bob的距离,利用了双层for循环,num++
五:在计算Bob–Alice距离,num++,最后输出num
代码展示如下:
package 第十届蓝桥杯大赛决赛题;
import java.util.Scanner;
public class 人物相关性分析 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
int K = sc.nextInt();
sc.nextLine();
String text = sc.nextLine();
//字符串分割,按照空格.分割字符,若是(.空格)分割后为空字符串。以两种方式分割,一种是\\s(空格方式分割),另一种是\\.(.方式分割)
String[] words = text.split("\\s+|\\.");//分割后的字符串赋值到words字符串数组中。
int[] wordsLength=new int[words.length];//创建一个数值型数组。存储words的字符串数组长度值
//将分割的字符串的长度值存储,避免三重循环中调用String.length();
for(int i=0;i<words.length;i++) {
wordsLength[i]=words[i].length();//循环遍历words字符串数组,并将每个字符串长度值存储在数值型数组中
}
int num=0;
//接下来是计算Alice--Bob的距离,利用了双层for循环
for(int i=0;i<words.length;i++) {
if(words[i].equals("Alice")){
for(int j=i+1;j<words.length;j++) {
int sum=1;
if(words[j].equals("Bob")) {
for(int k=i+1;k<j;k++) {
//每个单词的长度加空格占据的长度
sum+=wordsLength[k]+1;//
}
if(sum<=K) {
num++;
}
}
}
}
}
//Bob--Alice距离
for(int i=0;i<words.length;i++)
{
if(words[i].equals("Bob")) {
for(int j=i+1;j<words.length;j++) {
int sum=1;
if(words[j].equals("Alice")) {
for(int k=i+1;k<j;k++) {
sum+=wordsLength[k]+1;
}
if(sum<=K) {
num++;
}
}
}
}
}
System.out.println(num);
}catch (Exception e) {
sc.close();
}
}
}