如何在整数数组中找到三元组

时间:2016-04-25 19:24:06

标签: c#

我有一个整数数组。我想找出给定数组中是否存在任何三元组

int[] arr = [1,2,2,3,2,4];

public int FindTriplet(int[] arrayrecieve)
{
// TO return 1 ; // if the array has a triplet (foe example above array has 2,2,2)

}

否则

返回0;

}

3 个答案:

答案 0 :(得分:4)

您可以使用Linq的GroupBy()并查找计数至少为3的所有群组:

int[] arr = {1, 2, 2, 3, 2, 4, 1, 4, 6, 5, 4, 9};
var triplets = arr.GroupBy(x => x).Where(y => y.Count() >= 3).Select(z => z.First());
Console.WriteLine(string.Join(", ", triplets)); // Prints 2, 4

其工作原理如下:

  1. GroupBy(x => x)将数组中的所有元素细分为相同数字的组(即,所有1和1都在一个组中,所有2&#39;在另一个组中,依此类推)。< / LI>
  2. Where(y => y.Count() >= 3)过滤群组,以便只包含至少为3的计数(即项目数)的群组。
  3. Select(z => z.First())获取每个过滤后的组并仅选择每个过滤组的第一个元素(请注意,组中的每个元素当然都是相同的。)
  4. 请注意,您也可以这样写triplets的上述初始化:

    var triplets = 
        from number in arr
        group number by number into grouped
        where grouped.Count() >= 3
        select grouped.First();
    

    如果您想要在至少有一个三元组时返回1的特定要求,您可以这样做:

    int result = triplets.Any() ? 1 : 0;
    

    (虽然我原本以为你想要返回一个bool而不是一个int)

    此外,如果您想要找到计数为3的组,您只需将Where()更改为:.Where(y => y.Count() == 3)

答案 1 :(得分:1)

如果您返回1或0,除非您有特殊原因要求使用int,否则您应该返回bool。

using System.Linq;
using System.Collections.Generic;
public bool hasTriplet(int[] values)
{
    foreach (int i in values)
    {
        if (values.Where(v => v == i).ToList().Count >= 3)
        {
            return true;
        }
    }
    return false;
}

答案 2 :(得分:0)

int[] arr = {1,2,2,3,5,4};
Array.Sort(arr);
for (int i = 2; i < arr.Length; i++) if (arr[i-2] == arr[i]) return = 1;
return 0;