给定一个字符串的集合,格式如:
{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}
要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应
输出
{aaa bbb ccc ddd hhh},{eee fff}, {ggg}
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。
据说是百度的笔试题目,尝试着写了一下,没做过多的测试,不足之处,望请指正
package src.com.ant.test;
import java.util.ArrayList;
import java.util.HashMap;
/**
* 集合题目
* <p>(1)两两判断是否有交集,有则改变记录并集的集合的值,否则保存,最后将并集集合也保存
* <p>(2)实现如下 check方法和unite方法 在最坏的情况下检测次数不会超过长度最长的集合的检测次数
* <p>设有n个集合,最长的集合元素个数为m,则在最坏的情况下会检测m*m*(n-1)次,而合并时不会超过此最坏情况
* <p>则整个过程下来复杂度为O(m*m*n*n)
* <p>(3)可以在check方法和unite方法上利用其它的方法快速判断和取并集
* @author SavageGarden
*
*/
public class HelloWorld {
public static int length = 0;
public static ArrayList initList = new ArrayList();
public static ArrayList resultList = new ArrayList();
public static void main(String[] args){
initList = init();
System.out.println("合并前:initList-----------");
for(int i = 0; i < initList.size(); i++) {
for(int j = 0; j < ((String[])initList.get(i)).length; j++) {
System.out.print(((String[])initList.get(i))[j]+",");
}
System.out.println();
}
resultList = mainFunc(initList);
System.out.println("合并后:resultList---------");
for(int i = 0; i < resultList.size(); i++){
for(int j = 0; j < ((String[])resultList.get(i)).length; j++) {
System.out.print(((String[])resultList.get(i))[j]+",");
}
System.out.println();
}
}
/**
* 初始化list,得到要测试的字符串数组
* @author SavageGarden
* @return
*/
public static ArrayList init(){
ArrayList list = new ArrayList();
//初始化数组
String[] array1 = {"aaa","bbb","ccc"};
String[] array2 = {"bbb","ddd"};
String[] array3 = {"eee","fff","rrr"};
String[] array4 = {"ggg","rrr"};
String[] array5 = {"ddd","hhh"};
//添加到list
list.add(array1);
list.add(array2);
list.add(array3);
list.add(array4);
list.add(array5);
return list;
}
/**
* 合并两个字符串,得到其内容的并集
* @author SavageGarden
* @param a
* @param b
*/
public static String[] unite(String[] a,String[] b){
if(a.length > 0 && b.length > 0) {
// 首先实例化一个新的字符串数组以存储合并后的字符串数组
//其长度为全局变量length
String[] uniteString = new String[length];
int status = 0;//记录uniteString的下标变化
//如果a为长度较小的一个,则将a,b置换
if(a.length < b.length){
String[] c = a;
a = b;
b = c;
}
//首先将较小的字符串数组放到uniteString内
for(int i = 0; i < b.length; i++){
uniteString[i] = b[i];
}
status = b.length;//记录uniteString的下标变化
for(int i = 0; i < a.length; i ++) {
boolean flag = true;//标记a,b是否有相同值
for(int j = 0; j < b.length; j++) {
if(a[i].equals(b[j])){
flag = false;
}
}
if(flag){
uniteString[status] = a[i];
status ++;
}
}
return uniteString;
}
return null;
}
/**
* 校验字符串有无交集,有则返回true,否则返回false
* @param a
* @param b
* @return
*/
public static boolean check(String[] a,String[] b){
boolean result = false;
if(a.length > 0 && b.length > 0) {
int minLength = a.length < b.length?a.length:b.length;
//只要有一个元素相同,就说明有交集,则将result置为true
length = minLength;
if(a.length < b.length){
String[] c = a;
a = b;
b = c;
}
boolean flag = false;//标记a,b是否有相同值
for(int i = 0; i < a.length; i ++) {
for(int j = 0; j < b.length; j++) {
if(a[i].equals(b[j])){
result = true;
flag = true;
}
}
if(!flag){
length ++;
}
flag = false;
}
}
return result;
}
/**
* 判断一个要添加的字符串是否已经在数组中
* @param s
* @param list
* @return
*/
public static boolean canAdd(String[] s,ArrayList list){
for(int i = 0; i < list.size(); i++){
if(list.get(i).equals(s)){
return false;
}
}
return true;
}
/**
* 主方法
* <p>for循环判断两两之间是否有交集,有则改变uniteString的值,否则添加到resultList
* @param initList
* @return
*/
public static ArrayList mainFunc(ArrayList initList){
HashMap hm = new HashMap();
for(int i = 0; i < initList.size(); i++){
hm.put(new Long(i), "true");
}
String[] uniteString = null;
ArrayList resultList = new ArrayList();
for(int i = 0; i < initList.size(); i++){
if(hm.get(new Long(i)).equals("true")){
for(int j = i+1; j< initList.size(); j++){
if(uniteString == null){
if(check((String[])initList.get(i),(String[])initList.get(j))){
hm.put(new Long(i), "false");
hm.put(new Long(j), "false");
uniteString = unite((String[])initList.get(i),(String[])initList.get(j));
}else{
if(canAdd((String[])initList.get(j),resultList)){
resultList.add((String[])initList.get(j));
}
}
}else{
if(check(uniteString,(String[])initList.get(j))){
hm.put(new Long(i), "false");
hm.put(new Long(j), "false");
uniteString = unite(uniteString,(String[])initList.get(j));
}else{
if(canAdd((String[])initList.get(j),resultList)){
resultList.add((String[])initList.get(j));
}
}
}
}
}
}
if(uniteString == null){
uniteString = (String[])initList.get(0);
}
resultList.add(uniteString);
if(initList.size() == resultList.size()){
return resultList;
}else{
return mainFunc(resultList);
}
}
}
分享到:
相关推荐
例如,题目中的集合M是全集{1,2,3,4,5,6}的子集。 2. **集合的表示**:集合可以用花括号{}来表示,元素之间用逗号分隔。例如,集合{1,2,3}表示包含三个元素1、2、3的集合。题目中提到了错误的集合写法,例如元素...
在这个背景下,一套全面的复习题目集合显得尤为宝贵。今天,我们将探讨的是一份特别针对这些竞赛的编程复习资料——《蓝桥杯复习题目集合》。 该集合中的题目内容涵盖了广泛且重要的算法知识,包括但不限于排序、...
ArrayList方法介绍及源码分析其实就是一句话,List集合是有序的,根据索引(index)来访问元素,另外,list集合允许有重复的元素 ArrayList是List的实现
通过解决这些集合题目,学生不仅能够巩固和加深对集合基础知识的理解,而且还能提高解决逻辑推理题的能力。集合复习是对逻辑思维和抽象概念理解能力的一种锻炼,对于日后学习更高层次的数学内容打下坚实的基础。学生...
电赛的题目代码资料集合.zip电赛的题目代码资料集合.zip电赛的题目代码资料集合.zip电赛的题目代码资料集合.zip电赛的题目代码资料集合.zip电赛的题目代码资料集合.zip电赛的题目代码资料集合.zip电赛的题目代码资料...
在高考数学的集合题目中,这些基础知识是解题的前提。 具体到湖北省的高考数学联考试题中,集合类题目往往会涉及到集合的基本概念与运算。如之前提及的荆门、天门等地市2012年3月的高三联考理科试题中,题目要求...
在江苏省各地市的高考数学联考中,集合题目的编排和设计,旨在检验学生对于集合理论的理解及其在数学问题解决中的应用能力。集合作为高中数学的基石之一,其相关概念和性质的理解对于学生掌握后续的数学知识至关重要...
在解决具体的集合题目时,学生应学会如何根据题目要求,灵活运用集合的性质和运算规则。例如,当题目要求求解集合的并集时,学生需要明确并集的定义,找出所有元素,同时注意去重。当遇到补集的题目,要清楚补集的...
通过上述解析,我们可以看出,高考数学中的集合题目的解答通常涉及集合的基本概念、运算及性质。解题时需理解题意,准确运用集合的定义和运算规则,这有助于培养学生的逻辑思维能力和抽象思维能力。对于学生来说,...
集合的基本概念,包括集合的表示、元素的特性、以及基本的集合运算,是解决集合题目时所必须掌握的基础知识。例如,在题目中遇到两个集合的交集,考生需要明确交集所代表的是两个集合共有的元素,这就要求考生能够...
在解答高考数学中的集合题目时,应注重理解题目的意图,熟练掌握集合的基本运算,并灵活运用数形结合、化简、转化等策略。同时,要注意题目中可能隐藏的信息,如元素的共性、集合的关系等,这对于正确解题至关重要。...
答题小程序 list 题目集合
部分内容展示了两个具体的集合题目。第一个题目来自2012年东北三省四市教研协作体的第二次调研测试文科卷,涉及全集与集合的补集运算。第二个题目来自同年吉林市高三下学期期末教学质量检测文科卷,询问的是集合的...
在高考数学中,集合题目往往是以选择题、填空题和解答题的形式出现,考查学生对集合概念的理解和应用能力。比如,通过选择题中的集合M和N的交集与并集的求解,学生能够了解并集和交集的定义及其在实际问题中的应用。...
在解答集合题目时,学生不仅要理解集合的基本概念和运算规则,还要能够将这些知识灵活运用到具体的数学问题中去。比如,第13题和第15题分别涉及集合的并集和充分条件与必要条件的概念。这些题目要求学生在理解“如果...
经典算法设计与分析编程题集合划分题目和代码实现
集合是数学的基础概念之一,尤其在高中数学...以上是对集合题目的详细解答,涵盖了集合的基本运算、集合的性质以及它们在实际问题中的应用。这些知识点是高中数学的重要基础,对于理解其他数学概念和解决问题至关重要。
题目一:求两个集合的合并运算 在计算机科学中,集合是存储不重复元素的数据结构。合并两个集合通常涉及到将一个集合的所有元素添加到另一个集合中,确保结果集合中没有重复的元素。对于这个问题,可以使用两种基本...
本压缩包文件“电子设计竞赛题目集合”汇聚了从1994年至2019年间的历年竞赛题目,为参赛者提供了一个丰富的学习资源库。 首先,我们可以看到这个集合跨越了近三十年的时间,这意味着它包含了一段时期内电子科技发展...
例如,写出符合特定条件的集合题目,考察了学生对集合基本概念的熟练程度和运用能力。函数图像对称轴的题目,则是对函数图像变化规律的深入探究,学生需要对函数的性质有着直观的把握。幂函数恒过定点的题目,旨在...