0
点赞
收藏
分享

微信扫一扫

JAVA 蓝桥杯 算法训练 (新生舞会)

爱薇Ivy趣闻 2022-03-26 阅读 54
java

题目:

试题 算法训练 新生舞会

问题描述
  新生舞会开始了。n名新生每人有三个属性:姓名、学号、性别。其中,姓名用长度不超过20的仅由大小写字母构成的字符串表示,学号用长度不超过10的仅由数字构成的字符串表示,性别用一个大写字符‘F’或‘M’表示。任意两人的姓名、学号均互不相同。换言之,每个人可被其姓名或学号唯一确定。给出m对两人的信息(姓名或学号),判断他们是否能共舞。两人能共舞的充要条件为两人性别相异。

输入
  第一行一个整数n(2<=n<=1000),表示学生人数。接下来的n行每行依次包含一名新生的姓名、学号、性别,分别用一个空格隔开。
  之后的一行是一个整数m(1<=m<=1000),表示询问的数目。接着的m行每行包含两个信息(姓名或学号),保证两个信息不属于同一人,中间用一个空格隔开。

输出
  对于每个询问输出一行,如果两人可以共舞,输出一个大写字母‘Y’,否则输出一个大写字母‘N’。


样例输入
  4
  John 10 M
  Jack 11 M
  Kate 20 F
  Jim 21 M
  3
  John 11
  20 Jack
  Jim Jack


样例输出
  N
  Y
  N

提示
  可以把名字和学号都当成字符串处理

先上代码好吧

import java.util.*;

/*新生舞会
* 新生舞会开始了。n名新生每人有三个属性:姓名、学号、性别。其中,
* 姓名用长度不超过20的仅由大小写字母构成的字符串表示,
* 学号用长度不超过10的 仅由数字构成的字符串表示,
* 性别用一个大写字符‘F’或‘M’表示。任意两人的姓名、学号均互不相同。
* 换言之,每个人可被其姓名或学号唯一确定。给出m对 两人的信息(姓名或学号),
* 判断他们是否能共舞。两人能共舞的充要条件为两人性别相异。

提示
可以把名字和学号都当成字符串处理。可以按以下流程实现。
输入
第一行一个整数n(2< =n< =1000),表示学生人数。
接下来的n行每行依次包含一名新生的姓名、学号、性别,分别用一个空格隔开。
之后的一行是一个整数m(1< =m< =1000),表示询问的数目。
接着的m行每行包含两个信息(姓名或学号),保证两个信息不属于同一人,
中间用一个空格隔开。
输出
对于每个询问输出一行,如果两人可以共舞,输出一个大写字母‘Y’,
否则输出一个大写字母‘N’。
样例输入复制
4
John 10 M
Jack 11 M
Kate 20 F
Jim 21 M
3
John 11
20 Jack
Jim Jack
样例输出复制
N
Y
N

*/

public class Main{
//利用姓名存储性别
static Map<String, String> nm;
//利用 年龄存储性别
static Map<String, String> am;
//询问次数
static int select;

public static void main(String[] args) {
toUser();
}

/*数据初始化*/
static void toUser() {
Scanner sc = new Scanner(System.in);
//总人数
int len = sc.nextInt();
//吸收nextInt()产生的空格
sc.nextLine();
//创建两个map
//根据姓名获取性别
nm = new HashMap<String, String>();
//根据年龄获取性别
am = new HashMap<String, String>();
//循环输入数据
for (int i = 0; i < len; i++) {
String[] data = sc.nextLine().split(" ");
//根据姓名获取性别中的键值对是通过姓名寻找性别
nm.put(data[0], data[2]);
//根据年龄获取性别中的键值对是通过年龄寻找性别
am.put(data[1], data[2]);
}

select = sc.nextInt();//询问的次数
//吸收nextInt()产生的空格
sc.nextLine();
//根据用户输入的询问次数去寻找年龄
for (int i = 0; i < select; i++) {
//把用户输入的数据利用string类中的split方法分割称一个数组
String[] toDance = sc.nextLine().split(" ");
//拿到数组中的第一个元素
String s1 = toDance[0];
//拿到数组中的第二个元素
String s2 = toDance[1];
FindDances(s1, s2);
}
//关闭扫描器,以免占用系统资源
sc.close();
//遍历集合 输出结果
for (String string : array) {
System.out.println(string);
}
}
//产生的结果都在其中
static ArrayList<String> array = new ArrayList<String>();

static void FindDances(String s1, String s2) {
//如果用户输入的第一个数据在nm中存在并且用户输入的第二个数据在am中存在
if (nm.containsKey(s1) && am.containsKey(s2)) {
//拿到通过用户输入的两个数据来找到年龄
String v1 = nm.get(s1);
String v2 = am.get(s2);
//如果年龄不相同(可以一起跳舞)
if (!v1.equals(v2)) {
//必须跳舞安排上
array.add("Y");
return;
}
//年龄相同还跳什么
array.add("N");
return;
}
//接着对用户输入的数据进行条件判断呗
if (am.containsKey(s1) && nm.containsKey(s2)) {
String v1 = nm.get(s2);
String v2 = am.get(s1);
//如果没有匹配上
//如果没有匹配上
if (!v1.equals(v2)) {
array.add("Y");
return;
}
array.add("N");
return;
}
if (am.containsKey(s1) && am.containsKey(s2)) {
String v1 = am.get(s2);
String v2 = am.get(s1);
//如果没有匹配上
//如果没有匹配上
if (!v1.equals(v2)) {
array.add("Y");
return;
}
array.add("N");
return;
}
if (nm.containsKey(s1) && nm.containsKey(s2)) {
String v1 = nm.get(s2);
String v2 = nm.get(s1);
//如果没有匹配上
//如果没有匹配上
if (!v1.equals(v2)) {
array.add("Y");
return;
}
array.add("N");
return;
}
}

}

思路大概如此:

1:先拿到系统给的数据

例如:

4

John 10 M

Jack 11 M

Kate 20 F

Jim 21 M

这些是系统的数据,拿到之后,怎么搞

这些数据分为两大类

1:可以通过姓名拿到性别

2:可以通过年龄拿到性别

那就好了,既然这样的话,那就创建两个集合,一个用年龄来存性别   一个用姓名来存性别

创建好了之后,因为题目的数据是一行只有三个数据,所以我们存的时候,下标直接写死

存完了之后,就对用户输入的数据进行判断呗

用户输入的数据可以分为一下几种情况

1:名字   +   年龄   (   John    11    )

2:年龄   +   姓名   (   20     Jack)

3:姓名   +   姓名   (  Jim      Jack)

4:年龄   +    年龄   ( 10     11)  

通过用户输入的询问次数来一个循环

每次循环就拿到第一个值和第二个值

然后对这四种情况一写       看第一个值在  am ->(AgeMap)  也就是利用年龄存性别的集合中找看能不能找到,如果可以找到   再看第二个值  在  nm -> (NameMap)  中找不找到

对吧,如果找得到,利用该值拿到性别,进行判断   相等那还跳个鬼 ,不相等才跳

注意!!!

进行判断的时候,也就是通过用户输入的值拿到性别,并拿性别进行判断的时候   不能用   ==

 或者  !=          用equals   

为什么   ==   在比较两个int  类型的时候   是比较值    但是用在string  类型上  就不是比较值了

是比较这两个string的地址 (简单的来说:string类型的变量,如果想要比较值是否相等  用equals方法   这个方法如果两个字符串匹配上,返回的是true   没匹配上  是false)   在if的小括号里面写这个equals  如果匹配上了   返回的是true   就会执行if里面的语句

例:if(     字符串1.equals(字符串2)    )  {
        sout("博主是帅哥")

}

对吧   如果匹配上,这句话就会输出   然后我们在字符串1前面加上一个     感叹号!(英文输入法下的感叹号)

例:

if(   !  字符串1.equals(字符串2)    )  {
        sout("博主是帅哥")

}

那这句话就不会输出,应为   !   是取反的意思   如果匹配上  返回的是true  对吧   碰到  ! 那么true就会直接变成false   那括号里面是false  那肯定不会执行对吧

举报

相关推荐

0 条评论