数组合并问题

问题描述

{3,a}{3,b}{2,e}{5,c}{6,d}{9,a}{6,e}想这样的数组有N个这样的一维数组我想做融合,意思就是有一样的就合并例如上面的融合后的结果这这个样子的{3,a,b,9}{2,e,6,d}{5,c}求解

解决方案

解决方案二:
只说思路。首先定义一个链表。从第一个元素开始操作,先把第一个元素从链表里删除,然后遍历链表,寻找跟此元素有关系的元素,找到之后跟之前的元素合并,并且把找到的元素从链表里删除,然后重头开始遍历。遍历结束后就是跟第一个元素相关的元素都找齐了,然后再从现在链表里的第一个元素开始重复前面的过程。时间复杂度没细算,应该是O(N!)
解决方案三:
List<string[]>list_result=newList<string[]>();List<string[]>list_test=newList<string[]>();list_test.Add(newstring[]{"3","a"});list_test.Add(newstring[]{"3","b"});list_test.Add(newstring[]{"2","e"});list_test.Add(newstring[]{"5","c"});list_test.Add(newstring[]{"6","d"});list_test.Add(newstring[]{"9","a"});list_test.Add(newstring[]{"6","e"});for(inti=0;i<list_test.Count();i++){List<string>temp_arr=newList<string>();foreach(vartemp_iteminlist_test[i]){temp_arr.Add(temp_item);}list_test.RemoveAt(i);for(;;){inttemp_count=temp_arr.Count();for(intj=0;j<list_test.Count();j++){List<string>pass_temp=list_test[j].ToList();if(pass_temp.Intersect(temp_arr).Count()>0){temp_arr=temp_arr.Concat(pass_temp.Except(pass_temp.Intersect(temp_arr))).ToList();list_test.RemoveAt(j);}}if(temp_count==temp_arr.Count())break;}list_result.Add(temp_arr.ToArray());}/*list_resultCount=3System.Collections.Generic.List<string[]>[0]{string[4]}string[][0]"3"string[1]"a"string[2]"b"string[3]"9"string[1]{string[2]}string[][0]"5"string[1]"c"string[2]{string[4]}string[][0]"6"string[1]"e"string[2]"2"string[3]"d"string*/

解决方案四:
谢谢你们
解决方案五:
该回复于2012-04-18 09:50:08被版主删除
解决方案六:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){varlist=newList<string[]>(){newstring[]{"3","a"},newstring[]{"3","b"},newstring[]{"2","e"},newstring[]{"5","c"},newstring[]{"6","d"},newstring[]{"9","a"},newstring[]{"6","e"}};varMaps=newList<List<string>>();list.ForEach(x=>{if(Maps.Any(y=>y.Any(z=>x.Contains(z))))Maps.Where(y=>y.Any(z=>x.Contains(z))).First().AddRange(x);elseMaps.Add(newList<string>(x));});Maps.ForEach(x=>{if(Maps.Where(y=>y!=x).Any(y=>y.Any(z=>x.Contains(z)))){Maps.Where(y=>y!=x).Where(y=>y.Any(z=>x.Contains(z))).First().AddRange(x);x.Clear();}});foreach(variteminMaps.Where(x=>x.Count>0)){Console.WriteLine(string.Join(",",item.Distinct()));}}}}

3,a,b,95,c6,d,2,ePressanykeytocontinue...
解决方案七:
你可以看我这个帖子,打散后差不多http://topic.csdn.net/u/20120409/00/12bdc8f7-6f3e-43c4-bf43-86feaf07e47c.html
解决方案八:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){varlist=newList<string[]>(){newstring[]{"3","a"},newstring[]{"3","b"},newstring[]{"2","e"},newstring[]{"5","c"},newstring[]{"6","d"},newstring[]{"9","a"},newstring[]{"6","e"}};varresult=list.Select(x=>x.ToList()).ToList();result.ForEach(x=>{if(result.Where(y=>y!=x).Any(y=>y.Any(z=>x.Contains(z)))){result.Where(y=>y!=x).Where(y=>y.Any(z=>x.Contains(z))).First().AddRange(x);x.Clear();}});result=result.Where(x=>x.Count>0).ToList();foreach(variteminresult){Console.WriteLine(string.Join(",",item.Distinct()));}}}}

代码简化了下。
解决方案九:
该回复于2012-04-18 08:55:14被版主删除
解决方案十:
并查集问题,可以O(n)的
解决方案十一:
List<string[]>a=newList<string[]>();a.Add(newstring[]{"1","11"});a.Add(newstring[]{"2","11"});a.Add(newstring[]{"2","12"});a.Add(newstring[]{"3","12"});a.Add(newstring[]{"4","13"});a.Add(newstring[]{"5","13"});a.Add(newstring[]{"5","14"});a.Add(newstring[]{"6","14"});a.Add(newstring[]{"7","16"});a.Add(newstring[]{"8","16"});a.Add(newstring[]{"9","15"});a.Add(newstring[]{"10","15"});a.Add(newstring[]{"11","1"});a.Add(newstring[]{"11","2"});a.Add(newstring[]{"12","2"});a.Add(newstring[]{"12","3"});a.Add(newstring[]{"13","4"});a.Add(newstring[]{"13","5"});a.Add(newstring[]{"14","4"});a.Add(newstring[]{"14","6"});a.Add(newstring[]{"15","9"});a.Add(newstring[]{"15","10"});a.Add(newstring[]{"16","7"});a.Add(newstring[]{"16","8"});

引用3楼的回复:

谢谢你们

你的这个结果怎么不对呢??融合后的结果是111212413154716810159而实际的结果是12311124561314781691015
解决方案十二:
呵呵,我的代码没问题,你可以试试看。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){varlist=newList<string[]>();list.Add(newstring[]{"1","11"});list.Add(newstring[]{"2","11"});list.Add(newstring[]{"2","12"});list.Add(newstring[]{"3","12"});list.Add(newstring[]{"4","13"});list.Add(newstring[]{"5","13"});list.Add(newstring[]{"5","14"});list.Add(newstring[]{"6","14"});list.Add(newstring[]{"7","16"});list.Add(newstring[]{"8","16"});list.Add(newstring[]{"9","15"});list.Add(newstring[]{"10","15"});list.Add(newstring[]{"11","1"});list.Add(newstring[]{"11","2"});list.Add(newstring[]{"12","2"});list.Add(newstring[]{"12","3"});list.Add(newstring[]{"13","4"});list.Add(newstring[]{"13","5"});list.Add(newstring[]{"14","4"});list.Add(newstring[]{"14","6"});list.Add(newstring[]{"15","9"});list.Add(newstring[]{"15","10"});list.Add(newstring[]{"16","7"});list.Add(newstring[]{"16","8"});varresult=list.Select(x=>x.ToList()).ToList();result.ForEach(x=>{if(result.Where(y=>y!=x).Any(y=>y.Any(z=>x.Contains(z)))){result.Where(y=>y!=x).Where(y=>y.Any(z=>x.Contains(z))).First().AddRange(x);x.Clear();}});result=result.Where(x=>x.Count>0).ToList();foreach(variteminresult){Console.WriteLine(string.Join(",",item.Distinct()));}}}}

12,3,2,11,114,6,4,13,515,10,916,8,7Pressanykeytocontinue...
解决方案十三:
谢谢啊,我试试啊!~引用11楼的回复:

呵呵,我的代码没问题,你可以试试看。C#codeusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceConsoleApplication1{classProgram{stati……

时间: 2024-09-20 20:43:08

数组合并问题的相关文章

php下将多个数组合并成一个数组的方法与实例代码

1.合并数组 array_merge()函数将数组合并到一起,返回一个联合的数组.所得到的数组以第一个输入数组参数开始,按后面数组参数出现的顺序依次迫加.其形式为: 复制代码 代码如下: array array_merge (array array1 array2-,arrayN) 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面.返回作为结果的数组. 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值.然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,

php中如何把多个数组合并为一个数组

array_merge() 函数把两个或多个数组合并为一个数组. 如果键名有重复,该键的键值为最后一个键名对应的值(后面的覆盖前面的).如果数组是数字索引的,则键名会以连续方式重新索引. 例如: $news=M('news'); $sql="select count(a.news_id) as count_news,a.menu_id,b.pid from news a left join menu b on a.menu_id=b.menu_id where a.is_pass=0 group

php数组合并与拆分实例分析

 本文实例讲述了php数组合并与拆分的方法.分享给大家供大家参考.具体如下: 1 2 3 4 5 6 7 8 <?php $array1 = array("A","B","C","D"); $array2 = array("1","2","3","4"); $array3 = array("!","@"

php数组合并的二种方法

 这篇文章主要介绍了php数组合并的二种方法,同时讲了用加号和用array_merge合并数组的区别,需要的朋友可以参考下 我们首先给出两个数组   代码如下: <?php    $r = array(1,2,3,4,5,6);    $e = array(7,8,9,10);   ?>      下面我们用array_merge和加号来何必这两数组    代码如下: <?php   print_r($r+e); // 输出<span style="font-family

PHP将两个关联数组合并函数提高函数效率

 在foreach中循环查询数据代码量比较少,但是性能比较低,使用下面的字节写的函数可以解决 在foreach中循环查询数据代码量比较少,但是性能比较低,好点的解决办法是将id收集起来,用in一次性查询,但是这引发了数据结构不是我们用PHP自带的函数可以合并的,今天测试了一下:    使用下面的字节写的函数可以解决    从数据库中取出来的数据总是或多或少不符合我们心目中的数据结构,类似于下面的俩个数组,要形成SQL中类似于left join后两个数组合并:  代码如下: $test1 = Ar

php下将多个数组合并成一个数组的方法与实例代码_php技巧

1.合并数组 array_merge()函数将数组合并到一起,返回一个联合的数组.所得到的数组以第一个输入数组参数开始,按后面数组参数出现的顺序依次迫加.其形式为: 复制代码 代码如下: array array_merge (array array1 array2-,arrayN) 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面.返回作为结果的数组. 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值.然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,

php中有关合并某一字段键值相同的数组合并的改进_php技巧

下面是实现代码: /** **关于参数的说明 **$key键值相同的键名 **$array代表原数组 **$start代表$array[0][$key] **$newkey代表相同键值相同的键名 **/ function combine_same_val($array,$start,$key,$newkey){ static $new; foreach($array as $k=>$v){ if($v[$key]==$start){ $new[$v[$newkey]][] = $v; unset

php二维数组合并及去重复的方法_php技巧

本文实例讲述了php二维数组合并及去重复的方法.分享给大家供大家参考.具体实现方法如下: $arr = array_merge($labels,$label); //合并需要合并的俩个数组 $key = id;//去重条件 $tmp_arr = array();//声明数组 foreach($arr as $k => $v) { if(in_array($v[$key], $tmp_arr)) //搜索$v[$key]是否在$tmp_arr数组中存在,若存在返回true { unset($arr

c-C++关于数组合并的问题

问题描述 C++关于数组合并的问题 已知一个数组a[6]={1,6,3,4,0,2},另一个数组b[3]={7,2,5} 怎样将这两个数组合并为一个c[9]={1,6,3,4,0,2,7,2,5} 解决方案 如果要参考动态,因为数组不支持动态的维数,所以只能考虑使用指针来模拟数组. 这个问题的实现不难的.或者,你直接定义一个足够大的数组,就可以将两个小的数组进行合并. 解决方案二: 申请一个c[],然后用for循环一个一个的赋值.如果是字符串数组可以用strcpy和strcat函数进行复制和拼接

php-问个PHP数组合并的问题~请高手指点

问题描述 问个PHP数组合并的问题~请高手指点 $arr1=array( "0"=>array( 'id' => '2', 'b' => 0, 'num' => 4 ), "1"=>array( 'id' => '1', 'b' => 0, 'num' => 4 ) ); $arr2=array( "1"=>array( 'id' => '3', 'b' => 0, 'num' =