算法问题,请高手解答

zrcwzl 2015-09-06 11:13:23
请教各位高手,如何将以下数组合并?
Arr1 = {1,2,1};
Arr2 = {1,2,3};
Arr3 = {1,3,1};
Arr4 = {1,3,3};
Arr5 = {2,21};
Arr6 = {2,2,3};
Arr7 = {2,3,1};
Arr8 = {2,3,3};

按相同元素合并,得到最终数组
Arr = {1,2},{2,3},{1,3}
...全文
507 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
zrcwzl 2015-09-07
  • 打赏
  • 举报
回复
谢谢ajianchina,你的结果是正确的
SunliyMonkey 2015-09-07
  • 打赏
  • 举报
回复
好抽象,楼主都不说下,合并规则
  • 打赏
  • 举报
回复
有没有顺序,没顺序的话 ,放到个数组里面 然后distinct 就可以了
同心圆的故事 2015-09-06
  • 打赏
  • 举报
回复
楼主是否需要考虑合并顺序?例如{1,2,1}&{1,2,3}与{1,2,3}&{1,2,1}的合并结果相同吗?
  • 打赏
  • 举报
回复
List<string[]> list = new List<string[]>{
        new string[] {"1","2","1"},
new string[] {"1","2","3"},
new string[] {"1","3","1"},
new string[] {"1","3","3"},
new string[] {"2","2","1"},
new string[] {"2","2","3"},
new string[] {"2","3","1"},
new string[] {"2","3","3"},
new string[] {"3","3","3"}};

    var resultList = new List<string[]>();
    var num = 0;
    while (list.Count != num)
    {
        var log = (int)Math.Log(list.Count - num, 2);
        var take = (int)Math.Pow(2, log);
        resultList.Add(MergeArray(list.Skip(num).Take(take).ToList())[0]);
        num += take;
    }
    Console.WriteLine(string.Join("   ", resultList.Select(x => string.Join(",", x))));
调用部分修正为这样就满足你的要求了
  • 打赏
  • 举报
回复
肯定不对啊,不是你要求的,我写代码时还没看到你那个要求 我的做法是过滤忽略你多出来的数据,因为没法合并,所以如果最小化修改方式的话,就是在调用外面时可以用循环来做
zrcwzl 2015-09-06
  • 打赏
  • 举报
回复
谢谢starfd,不过结果不对
zrcwzl 2015-09-06
  • 打赏
  • 举报
回复
你速度好快,厉害!
zrcwzl 2015-09-06
  • 打赏
  • 举报
回复
如果去掉Arr8 = {2,3,3},合并后最短的数组长度是3,分别是 {1,23,13},{2,2,13},{2,3,1}或者{12,2,13},{1,3,13},{2,3,1}
  • 打赏
  • 举报
回复
static List<string[]> MergeArray(List<string[]> list)
{
    if (list == null || list.Count == 0)
    {
        throw new ArgumentException();
    }
    var x = (int)Math.Log(list.Count, 2);//保证只取最小整数部分
    if (x == 0)
    {
        if (list.Count == 1)
        {
            return list;
        }
        else
        {
            return new List<string[]> { list[0] };
        }
    }
    List<string[]> resultList = new List<string[]>();
    for (var i = 0; i < (int)Math.Pow(2, x); i += 2)
    {
        var li = list[i];
        var hi = list[i + 1];
        string[] tmp = new string[3];
        for (var j = 0; j < 3; j++)
        {
            tmp[j] = li[j];
            if (li[j] != hi[j])
            {
                tmp[j] += hi[j];
            }
        }
        resultList.Add(tmp);
    }
    return MergeArray(resultList);
}
严格按照你两两合并的顺序来,如果你将源数据改了,可以得到其他结果
List<string[]> list = new List<string[]>{
        new string[] {"1","2","1"},
new string[] {"1","2","3"},
new string[] {"1","3","1"},
new string[] {"1","3","3"},
new string[] {"2","2","1"},
new string[] {"2","2","3"},
new string[] {"2","3","1"},
new string[] {"2","3","3"}};

    var resultList = MergeArray(list);
    Console.WriteLine(string.Join(",", resultList[0]));
zrcwzl 2015-09-06
  • 打赏
  • 举报
回复
谢谢ajianchina,不过有个问题,不是所有数组都能合并,如果再加个Arr9 = {3,3,3},合并后的结果应该是两个数组 {12,23,13},{3,3,3},因为{3,3,3}合并不了
ajianchina 2015-09-06
  • 打赏
  • 举报
回复
没把你列的全放进去,放进去结果就是12,23,13
ajianchina 2015-09-06
  • 打赏
  • 举报
回复

List<string[]> list = new List<string[]>();
list.Add(new string[] { "1", "2", "1" });
list.Add(new string[] { "1", "2", "3" });
string[] arr = new string[list.First().Length];
for (int i = 0; i < arr.Length; i++)
{
	arr[i] = string.Join("", list.SelectMany(p=>p[i]).Distinct());
}

Console.WriteLine(string.Join(",", arr));
//result:1,2,13
zrcwzl 2015-09-06
  • 打赏
  • 举报
回复
Arr5 = {2,21};这个我写错了,少了一个逗号,应该是Arr5 = {2,2,1};
zrcwzl 2015-09-06
  • 打赏
  • 举报
回复
合并到不能合并为止,每个数组长度相同,不仅限3位
zrcwzl 2015-09-06
  • 打赏
  • 举报
回复
改成字符串更好理解吧,具体合并顺序类似这样: Arr1 = {1,2,1}; Arr2 = {1,2,3}; 合并为 {1,2,13} Arr3 = {1,3,1}; Arr4 = {1,3,3}; 合并为{1,3,13} Arr5 = {2,2,1}; Arr6 = {2,2,3}; 合并为{2,2,13} Arr7 = {2,3,1}; Arr8 = {2,3,3}; 合并为{2,3,13} {1,2,13}和{1,3,13}合并为{1,23,13} {2,2,13}和{2,3,13}合并为{2,23,13} 最终合并为{12,23,13}
bdmh 2015-09-06
  • 打赏
  • 举报
回复
你最终的结果是多维数组,没太清楚,结果和原始数据的对应
  • 打赏
  • 举报
回复
这什么意思啊,没看懂……
zrcwzl 2015-09-06
  • 打赏
  • 举报
回复
不知道Lambda的GroupBy方法能不能处理?
ajianchina 2015-09-06
  • 打赏
  • 举报
回复

static void Main(string[] args)
{
	List<string[]> list = new List<string[]>();
	list.Add(new string[] { "1", "2", "1" });
	list.Add(new string[] { "1", "2", "3" });
	list.Add(new string[] { "1", "3", "1" });
	list.Add(new string[] { "1", "3", "3" });
	list.Add(new string[] { "2", "2", "1" });
	list.Add(new string[] { "2", "2", "3" });
	list.Add(new string[] { "2", "3", "1" });
	//list.Add(new string[] { "2", "3", "3" });
	//list.Add(new string[] { "3", "3", "3" });
	List<string[][]> list2 = list.Select(p => p.Select(s => new string[] { s }).ToArray()).ToList();
	string[][] arr;
	int count;
	while (true)
	{
		count = list2.Count;
		foreach (var ar in list2)
		{
			arr = list2.Where(p => p != ar && Eq(p, ar)).FirstOrDefault();
			if (arr == null) continue;
			for (int i = 0; i < ar.Length; i++)
			{
				arr[i] = ar[i].Union(arr[i]).ToArray();
			}
			list2.Remove(ar);
			break;//循环体被改变,立即跳出
		}
		if (list2.Count == count) break;
	}

	foreach(var x in list2)
	{
		Console.WriteLine(string.Join(",", x.Select(p=>string.Join("",p))));
	}
}
static bool Eq(string[][] a, string[][] b)
{
	int x = 0;
	for (int i = 0; i < a.Length; i++)
	{
		if (a[i].Length != b[i].Length || a[i].Intersect(b[i]).Count()!=a[i].Length) x++;
	}
	return x <= 1;
}
result: 1,23,13 2,2,13 2,3,1
加载更多回复(13)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧