【字节跳动】2019笔试题--油豆瓶

参加了字节的笔试,白天刷了一整天的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);
上一篇:redis(五)、Set类型和zSet类型


下一篇:29.tr命令