蓝桥杯练习题

蓝桥杯练习题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 个字符。
注意:

  1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。
  2. 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();
	}
}
}

上一篇:1579. 保证图可完全遍历


下一篇:CF1055C 幸运的天数