如何检查5个整数中的3个是否相同

时间:2014-02-05 22:12:59

标签: c# integer

假设我有5个整数。

int a = 1;
int b = 2;
int c = 5;
int d = 1;
int f = 1;

我想检查这5个整数中的3个是否相同。

我尝试了一些东西,但是它很长(500多行)并认为这不是一个好方法。

5 个答案:

答案 0 :(得分:8)

首先将它们全部放在一个集合中,而不是使用单独的变量:

var numbers = new[]{a,b,c,d,f};

然后对它们进行分组,找到每个组的计数,看看是否符合您的标准。

var isLargeGroup = numbers.GroupBy(n => n, (key, group) => group.Count() )
    .Any(count => count >= 3);

答案 1 :(得分:1)

对于大型集合(比如说10000个数字),其他两种解决方案都可能很昂贵,这会花费一个完整的枚举并创建许多将被垃圾收集的对象。试试这个,这可能会在完整的枚举之前很久就停止执行:

private bool AreNumbersTheSame(int[] numbers, int duplicateCount)
{
    var numberCounts = new Dictionary<int, int>();
    for (int i = 0; i < numbers.Length; i++)
    {
        var current = numbers[i];
        if (!numberCounts.ContainsKey(current))
        {
            numberCounts[current] = 1;
            continue;
        }

        if (numberCounts[current] == duplicateCount - 1)
        {
            return true;
        }

        numberCounts[current]++;
    }
    return false;
}

称之为:

var result = AreNumbersTheSame(new[] { a, b, c, d, f }, 3);

答案 2 :(得分:0)

对于它的价值,这里的另一个选项不如GroupBy优雅,但如果序列很大则效率更高。隐藏在扩展方法中,可读性在我看来并不那么重要。

public static bool HasDuplicateCount<T>(this IEnumerable<T> seq, int maxCount)
{
    Dictionary<T, int> counts = new Dictionary<T, int>();
    foreach (T t in seq)
    {
        int count;
        if (counts.TryGetValue(t, out count))
            ++count;
        else
            count = 1;
        if (count == maxCount)
            return true;
        counts[t] = count;
    }
    return false;
}

您可以这样使用它:

bool threeDups = new[] { a, b, c, d, f }.HasDuplicateCount(3);

答案 3 :(得分:0)

这也可以使用Majority Vote算法解决,只要您想查看超过一半的元素是否相同(就像5个元素中的3个一样):

public static bool HasMajorityElement(int[] a)
{
    int candidate = 0;
    int count = 0;
    foreach (int i in a)
    {
        if (count == 0)
        { 
            candidate = i;
            count = 1;
        }
        else 
        {
            count += candidate == i ? 1 : -1;
        }
    }
    count = 0;
    foreach (int i in a)
    {
        if (i == candidate) ++count;
    }
    return count > a.Length / 2;
}
在ideone.com上

Test it

或者根据您的具体情况选择:

public static bool ThreeOutOfFive(int a, int b, int c, int d, int e)
{
    return ((a==b?1:0)+(a==c?1:0)+(a==d?1:0)+(a==e?1:0) > 1)
        || ((b==c?1:0)+(b==d?1:0)+(b==e?1:0) > 1)
        || ((c==d?1:0)+(c==e?1:0) > 1);
}

答案 4 :(得分:0)

我会做以下事情: -

  1. 将所有数字添加到列表中。

  2. 创建一个字典,其数字为KEY,其出现为VALUE。

  3. 在迭代列表时,需要检查数字是否不在字典中,然后使用数字作为KEY添加它,将1作为其值添加。

  4. 如果号码重新出现,只需将字典值增加1。

  5. 一旦等于3,就会脱离循环。

            int a = 1;
            int b = 2;
            int c = 5;
            int d = 1;
            int f = 1;
            var listOfNumbers = new List<int> {a, b, c, d, f};
    
            var dict = new Dictionary<int, int>();
            foreach (var number in listOfNumbers)
            {
                if (dict.ContainsKey(number))
                {
                    dict[number] = dict[number] + 1; //if a key repeats => increment the value by 1
                    if (dict[number] == 3)
                        break; //found the number
                }
                else
                    dict.Add(number, 1); //for first occurence of the key => initialize the value with 1 
            }