阿里测试开发笔试编程题

找朋友组队,输入一个N*N的二维数组,数组由0和1组成。第i行第j列的数据为1,表示i与j是朋友,可以一起组队,如M[1]和M[2],M[2]的朋友也可以加入到该队中,只要有朋友关系的都可以加入到同一对,而M[3]只能自己组队,因此最少需要组的对数是2.
M[1] = (1,1,0)
M[2] = (1,1,0)

M[3] = (0,0,1)
代码不是很规范,本来以为考迭代,迭代半天想不出来,换个思路发现更简单:i的朋友j如果已经组过队了就break,因为i可以加入到j的队伍里;如果i所有的朋友都没有组过队,i就开设一个新队,队数加1.
import java.util.*;
public class Main {
    static int findCircleNum(int[][] M) {
        int num=0;
        ArrayList F = new ArrayList();
        for(int i=0;i<M.length;i++){
            if(F.contains(i)){//如果i已经在已组队队列中了,直接跳出
                break;
            }
            boolean flag = false;//用于判断i加入已组队序列是否是利用朋友关系进入一个队
            for(int j=0;j<M[i].length;j++){
                if(M[i][j]==1 && i!=j){
                    if(F.contains(j)){  //判断i的朋友j是否已组队成功,是则跳出循环,因为i可以和j在同一个队,无需开一个新队
                        F.add(i); //i组队成功,加入已组队序列
                        flag = true;
                        break;
                    }
                }
                if(j == M[i].length-1){  //如果遍历到最后一个数,还没有组队成功,i开设一个新队,并加入已组队序列
                    F.add(i);
                }
            }
            if(flag==false){  //如果i的朋友都还没有组过队,则队数加一
                num++;
            }
        }
        return num;
    }
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int res;
        int _M_rows = 0;
        int _M_cols = 0;
        _M_rows = Integer.parseInt(in.nextLine().trim());
        _M_cols = Integer.parseInt(in.nextLine().trim());
        int[][] _M = new int[_M_rows][_M_cols];
        for(int _M_i=0; _M_i<_M_rows; _M_i++) {
            String row_x=String.valueOf(in.nextLine().trim());
            String[] row_y=row_x.split(",");
            for(int _M_j=0; _M_j<_M_cols; _M_j++) {
                _M[_M_i][_M_j] = Integer.parseInt(row_y[_M_j]);
            }
        }
        if(in.hasNextLine()) {
            in.nextLine();
        }
        res = findCircleNum(_M);
        System.out.println(String.valueOf(res));
    }
}

#阿里巴巴#
全部评论
女大神
点赞 回复 分享
发布于 2017-08-27 10:27
请问阿里测开和开发的笔试题一样吗
点赞 回复 分享
发布于 2020-08-14 08:25
我的题目好像和你的不一样
点赞 回复 分享
发布于 2020-08-20 18:53

相关推荐

不愿透露姓名的神秘牛友
02-12 10:05
小米集团 算法工程师 28.0k*15.0
泡沫灬一触即破:楼上那个看来是看人拿高薪,自己又不如意搁这泄愤呢是吧,看你过往评论很难不怀疑你的精神状态
点赞 评论 收藏
分享
老方子:英语等级cet写错了吧
点赞 评论 收藏
分享
01-24 12:50
门头沟学院 C++
投票
菜狗二号:还有啥想的 指定国有行啊,去了就开始幸福美满的生活了,选华子不是折腾自己么,最终财富积累度是差不多的,但是幸福指数是相差甚远的
点赞 评论 收藏
分享
评论
4
27
分享

创作者周榜

更多
牛客网
牛客企业服务