美团内推一面问题

面试官问了一道题,n个集合去重。 例如有3个集合 {1,2},{2,1},{3} 但其实前两个属于同一个集合,去除重复的,最后输出两个集合{1,2},{3} 当时回答的不好,复杂度很高,各位大神有什么好的方法或解题思路?

注意是集合去重,不是集合中的元素去重。
全部评论
我也是这个题目,写了排列,一直在那基础上改,没改出来。后来跟同学讨论,可以认为每个数都有出现和不出现两种可能,所以从第一位递归处理就好了,代码也很简单
点赞 回复 分享
发布于 2017-08-31 00:34
我当时的想法是大set套小set。小set排序,也就是大家所说的排序,但是这样会打乱原来小集合的顺序。 例如 {3,2,4}, {4, 2, 3}会输出 {2,3,4}。而原集合中没有这个集合。原本题意只是去除元素重复的小集合。 public class test { public static void main(String[] args) { Scanner input=new Scanner(System.in); int n=input.nextInt(); input.nextLine(); Set<Set<Integer>> set=new LinkedHashSet<>(); for(int i=0;i<n;i++){ Set <Integer> subSet=new TreeSet<Integer>(); String strings[]=input.nextLine().split(" "); for(int j=0;j<strings.length;j++) subSet.add(Integer.parseInt(strings[j])); set.add(subSet); } Iterator<Set<Integer>> it = set.iterator(); while(it.hasNext()){ System.out.print(it.next()+" "); } } }
点赞 回复 分享
发布于 2017-08-31 17:33
遍历每个子集合,计算子集合的总和sum以及个数n,然后拼成键值sum#n,存到Set<String>中。如果下一个集合的键值sum#n在Set中存在,则表示该集合重复。
点赞 回复 分享
发布于 2017-08-31 15:04
使用set集合类来做,先将得到的每个集合排序,然后将排序之后的集合放到set集合中,set集合会将重复的集合去掉,只保留单个不重复的集合。 代码如下: import java.util.Arrays; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.Scanner; import java.util.Set; /*  * n个集合去重。 例如有3个集合 {1,2},{2,1},{3}   * 但其实前两个属于同一个集合,去除重复的,最后输出两个集合{1,2},{3}  * */ public class 集合去重 { public static void main(String[] args) { Scanner input=new Scanner(System.in); int n=input.nextInt(); input.nextLine(); Set<LinkedList<Integer>> set=new LinkedHashSet<>(); for(int i=0;i<n;i++){ LinkedList<Integer> list=new LinkedList<>(); String strings[]=input.nextLine().split(" "); int temp[]=new int[strings.length]; for(int j=0;j<strings.length;j++) temp[j]=Integer.parseInt(strings[j]); Arrays.sort(temp); for(int j=0;j<strings.length;j++) list.add(temp[j]); set.add(list); } System.out.println(set); input.close(); } }
点赞 回复 分享
发布于 2017-08-31 10:30
老铁现在有什么好的解法了吗?4楼的方法如何?
点赞 回复 分享
发布于 2017-08-31 10:23
楼主实在哪个城市面试的?还问了其他什么问题吗?
点赞 回复 分享
发布于 2017-08-31 09:42
每输入一个集合,new一个HashSet放进去,然后用HashSet<HashSet> hashSets把这些new的HashSet实例都add进去就去重了,不知道这样用集合类符不符合要求。。。
点赞 回复 分享
发布于 2017-08-31 08:52
大list包小list,在输入的时候用小list不断接收然后排序,然后!contains判断是否放入,最后返回大list
点赞 回复 分享
发布于 2017-08-31 00:43
这不是前几天中兴的笔试题吗,定义一个大arraylist<arraylist<integer>>里面包含生成的小的arraylist,这样一个个的去遍历给的集合,大arraylist里面包含有给的集合的其中一个数的,就把集合中不相同的数加进去大arraylist对应的小arraylist里面,遍历的该集合里面的数全部不在的,就心创建一个放进大arraylist里面
点赞 回复 分享
发布于 2017-08-31 00:31
private static void deleteRepectList(ArrayList<ArrayList<Integer>> list) {            HashMap<ArrayList<Integer>, Integer> map=new HashMap<>();            for (ArrayList<Integer> arrayList : list) {           Collections.sort(arrayList);           map.put(arrayList, 1); }            for (ArrayList<Integer> arrayList : map.keySet()) { System.out.println(arrayList); } }   感觉复杂度还是够高
点赞 回复 分享
发布于 2017-08-31 00:30
把集合排序
点赞 回复 分享
发布于 2017-08-31 00:24
mark 一记 。
点赞 回复 分享
发布于 2017-08-31 00:17
实现一个toString(),然后hash
点赞 回复 分享
发布于 2017-08-31 00:11

相关推荐

04-06 16:59
已编辑
河南工业大学 Java
牛牛牛的牛子:最好扔了,实在没有选择的选择
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务