题解 | 隐匿社交网络
隐匿社交网络
https://www.nowcoder.com/practice/2870f9db6aeb4eb08fbd6460397f9bf4
Scanner in = new Scanner(System.in); in.nextInt(); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextInt()) { // 注意 while 处理多个 case int n = in.nextInt(); int[]arr = new int[n]; for(int i =0;i<n;i++) arr[i] = in.nextInt(); // 记录各个网络组,group[i]为该组各个节点值位或运算(x|y)的结果 List<Integer> group = new ArrayList<>(); group.add(arr[0]); // size[i]对应group[i]的节点数量 int[]size = new int[n]; size[0]=1; for(int i =1;i<n;i++) { int node = arr[i]; int firstJ = -1; // 标记node与group第一个匹配的坐标 for(int j=0;j<group.size();j++) { int groupValue = group.get(j); if ((groupValue & node) > 0) { if (firstJ == -1) { //node第一次匹配成功 firstJ = j; group.set(j, groupValue|node); size[j]++; } else { //node第n次匹配成功 group.set(j, 0); //把当前group[j]累加到group[firstJ],并置空group[j] size[firstJ] += size[j]; size[j]=0; } } } if(firstJ==-1) { // node没有匹配到group,加入一个新的group size[group.size()]++; group.add(node); } } int max = 0; //求最大值 for(int i =0;i<n;i++) max = Math.max(max, size[i]); System.out.println(max); } }