人物相关性分析
思路:
1、输入K 和一行字符串,然后按照”空格和. ("\\s+|\\.")“ 进行分割成单词数组
2、暴力破解,3重循环,分别为寻找Alice--> Bob 和 Bob --> Alice(也就是有两个)
3、Alice --> Bob
①第一重循环判断字符串中的下标i中是否出现了Alice,i递增,②如果出现了,if{} 里面继续for循环,判断j从i开始,判断j的后面是否出现Bob,③如果出现了Bob,继续判断间距长度,if里面继续for循环,l从i+1,开始,l < j,因为计算的就是他们两个单词之间的间距长度,注意的是计数变量sum要从1开始,因为 避免有的相邻单词会进不了循环里面,然后再判断sum是否小于k,也就是我们规定的最大间距,如果是,count++,
4、Bob --> Alice
其实就是重复上一步的操作,只不是把哪个Alice换成Bob,把Bob换成Alice。
因为题目所要求的的就是同时出现Alice和Bob,并没有规定两个的顺序。
5、输出count,也就是输出符合规定出现的次数,
输入:
20
This is a story about Alice.and.Bob.Alice wants to send aprivate message to Bob.
代码实现:
package date_0404;
import java.util.Arrays;
import java.util.Scanner;
import sun.security.util.Length;
public class Main1 {
public static void main(String[] args) {
long time = System.nanoTime();
Scanner scanner = new Scanner(System.in);
int k = scanner.nextInt(); // 最大间距值
scanner.nextLine();//吸取回车键换行
String str1 = scanner.nextLine(); // 字符串
int count = 0; //答案
//1、按空格和.进行分割字符串
String[] sp = str1.split("\\s+|\\.");
System.out.println(Arrays.toString(sp));
//2、从 Alice --> Bob
for (int i = 0; i < sp.length; i++) {
if (sp[i].equals("Alice")) { //找到了Alice,继续找bob
for (int j = i+1; j < sp.length; j++) {
if (sp[j].equals("Bob")) { //找到了Bob,继续判断长度
//计算间距长度
int sum = 1;
/*
这里需要等于1,因为有可能我们按照 “空格和.” 分割后的单词组他们之间就是相邻的,
这样就不会进入下面的循环。但是实际中是有一个分隔符的,所以这里等于1就是避免那种情况发生。
*/
for (int l = i+1; l < j; l++) {
/*
i + 1 :因为算的是Alice之间的间距,
l < j:因为求的就是Alice - Bob之间的间距
*/
sum+=sp[l].length() + 1;//加1是因为计算后空格,
}
//判断间距长度是否合法
if (sum <=k) {
System.out.println("间距为:"+sum);
count++;
}
}
}
}
}
//3、从 Bob --> Alice
for (int i = 0; i < sp.length; i++) {
if (sp[i].equals("Bob")) {
for (int j = i+1; j < sp.length; j++) {
if (sp[j].equals("Alice")) {
int sum = 1;
for (int l = i+1; l <j; l++) {
sum+=sp[l].length()+1;
}
if (sum <= k) {
System.out.println("间距为:"+sum);
count++;
}
}
}
}
}
System.out.println(count);
long time2 = System.nanoTime();
System.out.println(time2-time);
}
}
结果展示:
拓展:
\ 转义字符
"\\s" 一个空格
"\\s+" 任意个空格
"\\." 字符.
"\t" 制表符
"\n" 换行符