- 用ArrayList去嵌套一个HashSet集合,去存放每个集合,以及他们的元素,因为输入时可能也会出现重复元素,于是用set;
- 然后在处理的时候,我用一个HashSet集合all去存放两个集合的所有元素,用一个HashSet集合temp去存放第一个集合的元素;
- 我通过两次循环,第一次把第一个集合的所有元素加进all和temp中;第二次也把所有元素加进了all中,然后向temp中添加第二个集合的元素,如果添加失败,那么就是共同元素,用一个变量common去记录;
- 最后输出的时候,我们需要用两个%%来表示百分号;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//一维放的集合,二维放的集合里面元素
ArrayList<HashSet<Integer>> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
int m = sc.nextInt();
list.add(new HashSet<>());
for (int j = 0; j < m; j++) {
list.get(i).add(sc.nextInt());
}
}
int k = sc.nextInt();
for (int i = 0; i < k; i++) {
//将其中一个集合的所有元素放进一个set,然后把另一个集合的元素也加在set里,统计加不进去的次数,就是两个集合的共有的不同元素
HashSet<Integer> temp = new HashSet<>();
HashSet<Integer> all = new HashSet<>();//两个集合一共有的不相等整数的元素
int common = 0;
int x = sc.nextInt();
int y = sc.nextInt();
for (Object o : list.get(x - 1)) {//遍历第x个集合
all.add((Integer) o);
temp.add((Integer) o);
}
for (Object o : list.get(y - 1)) {//遍历第y个集合
all.add((Integer) o);
if (temp.add((Integer) o) == false) {//说明这个元素没加进去,是共有元素
common++;
}
}
System.out.printf("%.2f%%\n", 100.0 * common / all.size());
}
}
}
c++ AC
- 刚开始和上面的java同思路,如下面注释的那一段,但是最后一个测试点超时了,可能内部两遍循环,比较费时;
- 然后参考了网上大佬的思路,就是用一个变量all去记录两个集合的不相等的元素总数,我们可以把v[b-1],这个集合的大小赋给all,然后遍历v[a-1]这个集合,利用find函数,如果v[a-1]中的元素不在v[b-1]集合中,那么就会返回v[b - 1].end();
- 如果v[a-1]中的元素不在v[b-1]集合中,那就all++,否则就是为共同元素,用一个commo变量去记录;
- 新学到的set知识点:
4.1 temp.insert(o).second == false:表示temp这个set集合,添加元素失败
4.2 v[b - 1].find(o) == v[b - 1].end(),表示v[b-1]这个set集合没有查找到o这个元素;
4.3 vectorv(n),需要指明向量的长度,这个n刚开始没加,就出错了,不太理解,有会的大佬可以告知一下;
#include
using namespace std;
int main() {
int n;
cin >> n;
vector<set<int>> v(n);
for (int i = 0; i < n; i++) {
int m;
cin >> m;
for (int j = 0; j < m; j++) {
int val;
cin >> val;
v[i].insert(val);
}
}
int k;
cin >> k;
for (int i = 0; i < k; i++) {
int a, b;
cin >> a >> b;
//同java思路,但最后一个点超时
// set all;
// set temp;
// int common = 0;
// for (auto o : v[a - 1]) {
// temp.insert(o);
// all.insert(o);
// }
// for (auto o : v[b - 1]) {
// if (temp.insert(o).second == false) {//表明添加失败
// common++;
// }
// all.insert(o);
// }
// printf("%.2lf%\n", 100.0 * common / all.size());
int common = 0;//共同元素
int all = v[b - 1].size();//两个集合全部的元素 ,放的是b-1的,那么遍历a-1,看看与b-1集合有几个共同的
for (auto o : v[a - 1]) {
if (v[b - 1].find(o) == v[b - 1].end()) { //没有找到共同元素
all++;
} else {
common++;//共同的元素
}
}
printf("%.2lf%\n", 100.0 * common / all);
}
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)