一、题目链接
C-次佛锅_2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(重现赛)@威扬工作室 (nowcoder.com)
二、题目简介
通过hashmap来存放和value之后再通过key来查value
输入
chi 1 huo 3 guo 1
3
chi
huo
guo
输出
1
3
1
三、涉及知识点
这道题涉及的知识点如下:
hashmap、、内存申请。
如果都已经掌握,请自行将这道题过掉;如果没有掌握,请务必先将这些知识点进行掌握。
四、算法分析
- 首先分析输入的字符,可以发现每个字符串后面都有一个数字,所以每对由字符串和数字组成,所以用输入的s为key 输入的n为value,存入map
- 之后输入的数字是接下来是需要查询的字符串的数量,
- 之后再输入的是需要查询的字符串
- 时间复杂度为n,没有循环的嵌套
- 详细解释看代码详解
五、源码讲解
Scanner sc=new Scanner(System.in);
String s;
String s2;
int n;
int m;
Map<String, Integer>map=new HashMap<String, Integer>();
while(true) {
s=sc.next();
if(s.charAt(0)>'9'||s.charAt(0)<'0') {
n=sc.nextInt();
map.put(s,map.getOrDefault(s, 0)+n);
}
else {
m=Integer.parseInt(s);//输入到最后的个数
break;
}
}
创建好map时,注意map的类型
- 在创建一个死循环,一直到输入的数字没有匹配的字符串
- 输入s,当输入的字符串不是数字时,再次输入整数,表示这个字符串的个数,或者菜名的个数,
- map.put(s,map.getOrDefault(s, 0)+n);这个代码是重点代码,每次将字符串为key 数量为value存入map,每次存放时都需要查询当前map中个当前字符串的个数 (value);map.getOrDefault(s, 0)就是查找s的value;map.put(s,map.getOrDefault(s, 0)+n);如果存在s则再次基础上在次添加新的个数n;
- 当没有输入字符串时,输入数字,自然不会进入if循环,则会将输入的字符串强转为整形,也就是输入查询菜名的个数;之后就退出循环
for (int i = 0; i < m; i++) {
s2=sc.next();
System.out.println(map.getOrDefault(s2, 0));
}
- 在上面我们将输入的整形得到后,也就是输出打印的个数m;
- 我们再次输入即将查询的菜名,并在map中查询,之后在打印value
具体代码
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s;
String s2;
int n;
int m;
Map<String, Integer>map=new HashMap<String, Integer>();
while(true) {
s=sc.next();
if(s.charAt(0)>'9'||s.charAt(0)<'0') {
n=sc.nextInt();
map.put(s,map.getOrDefault(s, 0)+n);
}
else {
m=Integer.parseInt(s);//输入到最后的个数
break;
}
}
for (int i = 0; i < m; i++) {
s2=sc.next();
System.out.println(map.getOrDefault(s2, 0));
}
}
}
六、FAQ
请各位大佬指正,共勉!