给定一个字符串的集合,格式如:
{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电赛的题目代码资料...
【标题】"蓝桥杯复习题目集合"是一个针对编程竞赛准备的资源包,主要涵盖了C语言和Java语言的算法题目及解答。这个压缩包显然旨在帮助参赛者或对算法学习有兴趣的人进行训练和复习,以提升他们在ACM(国际大学生程序...
在提供的部分内容中,我们可以看到两个具体的集合题目。第一个题目来自荆门、天门等八市2012年3月的高三联考理科试题,问题要求求解集合A与集合B的差集。根据选项和解析,我们知道集合A包含元素1,而集合B包含元素1...
通过上述解析,我们可以看出,高考数学中的集合题目的解答通常涉及集合的基本概念、运算及性质。解题时需理解题意,准确运用集合的定义和运算规则,这有助于培养学生的逻辑思维能力和抽象思维能力。对于学生来说,...
在解答高考数学中的集合题目时,应注重理解题目的意图,熟练掌握集合的基本运算,并灵活运用数形结合、化简、转化等策略。同时,要注意题目中可能隐藏的信息,如元素的共性、集合的关系等,这对于正确解题至关重要。...
答题小程序 list 题目集合
部分内容展示了两个具体的集合题目。第一个题目来自2012年东北三省四市教研协作体的第二次调研测试文科卷,涉及全集与集合的补集运算。第二个题目来自同年吉林市高三下学期期末教学质量检测文科卷,询问的是集合的...
经典算法设计与分析编程题集合划分题目和代码实现
题目一:求两个集合的合并运算 在计算机科学中,集合是存储不重复元素的数据结构。合并两个集合通常涉及到将一个集合的所有元素添加到另一个集合中,确保结果集合中没有重复的元素。对于这个问题,可以使用两种基本...
本压缩包文件“电子设计竞赛题目集合”汇聚了从1994年至2019年间的历年竞赛题目,为参赛者提供了一个丰富的学习资源库。 首先,我们可以看到这个集合跨越了近三十年的时间,这意味着它包含了一段时期内电子科技发展...
毕业设计题目集合.docx毕业设计题目集合.docx毕业设计题目集合.docx毕业设计题目集合.docx毕业设计题目集合.docx毕业设计题目集合.docx毕业设计题目集合.docx毕业设计题目集合.docx毕业设计题目集合.docx
【华为OJ题目集合】是华为在线判题(Online Judge,简称OJ)系统的一份题目合集,主要面向编程爱好者和求职者,提供了一系列的编程挑战,旨在提升编程技能和解决问题的能力。这个集合可能包含了C和C++两种语言的解题...
题目中提到了集合A={-2, 0, 1}和集合B={x∈Z|x^2+2x≤0},并要求找出A与B的交集。这涉及到集合的交集运算,即找出同时属于集合A和集合B的所有元素。对于集合B,可以通过解不等式x^2+2x≤0得到其所有整数解,然后与...
【标题】"727_基础题目集合"的描述中并未提供具体的IT知识点,但从标题来看,这可能是一个关于编程或技术学习的资源包,包含了多个基础题目,旨在帮助学习者巩固基础知识。在这个集合中,我们可以期待看到各种类型的...
2. 集合题目考察了集合的基本性质和集合间的关系,以及集合运算的理解。 3. 函数最大值的问题涉及到函数的性质,如单调性、最值等。 4. 函数的奇偶性和单调性问题,要求学生能识别函数的性质并进行比较。 5. 平面...
1. 集合题目解析中,对集合运算的规则进行了应用,如选项中的集合表达和结果的判断。 2. 复数题目解析涉及复数的加法以及共轭复数的计算,这是高中数学中复数运算的基础。 3. 圆锥题目解析中,通过几何知识,结合...
- 在集合题目中,解析强调了化简集合和理解集合关系的重要性,同时提示了使用数形结合方法解决问题。 - 对于向量问题,解析给出了向量投影的计算方法,即向量乘法和模长的运用。 - 在等差数列题目中,解析通过等...
数据库题目集合.pdf