参加了字节的笔试,白天刷了一整天的18年笔试题(其实就做了2题hhh),感觉会用Map<Integer, List>应该能做出至少两题,看到油豆后疯狂思考怎么用Map的套路解决,直至放弃。后灵光乍现,觉Set大法可行,一试通过90%,赶紧换下一题,望字节大佬批卷手下留情。
第一题如下
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int[][] arr = new int[num][num];
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
//遍历所有的输入存放在二维数组中
arr[i][j] = scanner.nextInt();
}
}
Set<Integer> set1 = new HashSet<>();
int count = 0;//油豆瓶数
for (int i = 0; i < num; i++) {
for (int j = i + 1; j < num; j++) {
//遍历数组中每一个值
if (arr[i][j] >= 3) {
//如果arr[i][j]>=3则需要判断是 新的油豆 还是 已存在的某一个油豆集的补充
//如果目前的Set中没有i和j,则说明是新的油豆集,否则则是补充
if (!(set1.contains(i) || set1.contains(j))) {
count++;
}
//set可以去重,所以不用担心重复值
set1.add(i);
set1.add(j);
}
}
}
//根据观察认为,“独立存在”的油豆瓶这一列/行都为0,如arr[1][]或arr[][1]都是0,则count数需要+1。这里计算没有在set中的用户数left,left就是所说的行/列都为0的“独立油豆”
int left = num - set1.size();
System.out.println(count + left);
考试结束后改进的版本:合并了循环;判断条件中的>3改成了>=3。不知道对不对(坏笑.jpg),心态小崩,刷了一天的算法题,第一题都没有100%通过。(感觉10%没通过就是因为>3的原因,我同学>=3就通过了)
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int[][] arr = new int[num][num];
Set<Integer> set1 = new HashSet<>();
int count = 0;
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
arr[i][j] = scanner.nextInt();
if (arr[i][j] >= 3) {
if (!(set1.contains(i) || set1.contains(j))) {
count++;
}
set1.add(i);
set1.add(j);
}
}
}
int left = num - set1.size();
System.out.println(count + left);