题解 | 隐匿社交网络
隐匿社交网络
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);
}
}
