例子:
1 2 5 11 12 15 21
1 3 5 10 13 16 21
1 4 5 12 14 17 22
1 6 7 11 12 15 21
.
.
.
.问题:
有很多条数据,数字之间是以空格隔开, 我想每行数据之间作比较,有同样的数字三个的话,把它写出来。。看上面的例子,第一行数据和第二行数据中,1,5,21 是相同的, 想msgbox 打出 ”第一行和第二行的 1,5,21 是相同的“。。有什么好算法,请大家帮忙?

解决方案 »

  1.   


                string str = @"1 2 5 11 12 15 21
    1 3 5 10 13 16 21
    1 4 5 12 14 17 22
    1 6 7 11 12 15 21";
                string[] temp = str.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < temp.Length; i++)
                {
                    string[] t1 = temp[i].Split(' ');
                    for (int j = i + 1; j < temp.Length; j++)
                    {
                        string[] t2 = temp[j].Split(' ');
                        bool exists = false;
                        foreach (string s in t1)
                        {
                            if (Array.IndexOf(t2, s) > -1)
                            {
                                if (!exists)
                                {
                                    Console.Write("第{0}行和第{1}行的", i + 1, j + 1);
                                    exists = true;
                                }
                                else
                                    Console.Write(",");
                                Console.Write(s);
                            }
                        }
                        if (exists)
                            Console.WriteLine("是相同的");
                    }
                }
    /*
    输出:
    第1行和第2行的1,5,21是相同的
    第1行和第3行的1,5,12是相同的
    第1行和第4行的1,11,12,15,21是相同的
    第2行和第3行的1,5是相同的
    第2行和第4行的1,21是相同的
    第3行和第4行的1,12是相同的*/
      

  2.   

    string source = @"1 2 5 11 12 15 21
    1 3 5 10 13 16 21
    1 4 5 12 14 17 22
    1 6 7 11 12 15 21
    ...";string[] lines = source.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
    for (int i = 1; i < line.Count(); i++)
    {
        var first = lines[i - 1].Split(' ');
        var second = lines[i].Split(' ');
        var equ = first.Intersect(second);
        if (equ.Count() == 3) 
            MessageBox.Show(string.Format("第{0}行和第{1}行的{2}是相同的。", i, i + 1, string.Join(', ', equ)));
    }
      

  3.   


    string[] sourceList = { "1 2 5 11 12 15 21", "1 3 5 10 13 16 21", "1 4 5 12 14 17 22", "1 6 7 11 12 15 21" };            for (int i = 0; i < sourceList.Length; i++)
                {
                    for (int j = i + 1; j < sourceList.Length; j++)
                    {
                        var first = sourceList[i].Split(' ');
                        var second = sourceList[j].Split(' ');
                        var equ = first.Intersect(second);
                        if (equ.Count() == 3)
                        {
                            Console.Write(string.Format("第{0}行和第{1}行的", i+1, j+1));
                            int n = 0;
                            for (; n < equ.Count() - 1; n++)
                            {
                                Console.Write(equ.ElementAt(n) + ",");
                            }
                            Console.WriteLine(equ.ElementAt(n) + "是相同的");
                        }
                    }
                }
      

  4.   

    既然可以,还需要什么别的方法?
    关键是你掌握原理,本质上来说,我和OJ的方法是一样的。因为LINQ提供了求交集的方法,所以把他的代码简化了一点。
    不是说不应该集思广益探讨各种方法,实在是你这样简单的问题不值得去研究什么很多方法,把基本的掌握就行了。如同吃饭走路,还分很多方法么?