如何检查数组中的成对元素数量?

时间:2018-10-21 19:24:54

标签: c# .net

我正在尝试解决问题,但似乎找不到正确的解决方法。例如:array [] = {1,1,1,1,1,2,3,3,4}。这里1对是2,而3对是1。所以总共有3对。我正在尝试解决这个问题。这是当前的代码情况。

static int PairCounter(int n, int[] ar) {
    int temp_n = 0;

    //store the array range with constrains
    Console.WriteLine("Enter the number of object: ");
    temp_n = Console.Convert.ToInt32(Console.ReadLine()); 
    if((temp_n >= 1) || (temp_n <= 100)){
        n = temp_n;
    }else{
        Console.WriteLine("Please enter a value less then 100 and greater then 1.");
        temp_n = Console.Convert.ToInt32(Console.ReadLine()); 
        if((temp_n >= 1) || (temp_n <= 100)){
            n = temp_n;
        }else{
                Console.WriteLine("Please rerun the code.");
            }
    }
    //Stores Array with constrains
    Console.WriteLine("Enter the number of array: ");
    int[] arr = new int[n];

    for(int i = 0; i<= n; i++){
        arr[i] = Console.Convert.ToInt32(Console.ReadLine()); 
        if((arr[i] >= 1) || (arr[i] <= 100)){
            ar[i] = arr[i];
        }else{
            Console.WriteLine("Please enter a value less then 100 and greater then 1.");
            arr[i] = Convert.ToInt32(Console.ReadLine()); 
            if((arr[i] >= 1) || (arr[i] <= 100)){
                ar[i] = arr[i];
            }else{
                    Console.WriteLine("Rerun the code");
                }
        }    
    }

    //copy the array to another array
    int[] array3 = new int[n];
    for(i=0;i<=n; i++)
    {
    array3[i]=ar[i];
    }
    int repeat_counter = 0;

    for(int i = 0; i<=n;i++){
        if(ar[i].Contains(array3[i])){
            repeat_counter++;
        }
    }
}

任何帮助都是可贵的。

2 个答案:

答案 0 :(得分:2)

您可以在一个衬里中执行此操作:

var pairs = ii.GroupBy(i => i).Sum(g => g.Count() / 2);

但是,是的,在当前情况下,使用linq正在作弊。解决此问题的一种简单方法是利用您在计算整数的优势。通过使用与索引相同的数字,您可以使用数组来跟踪找到的给定数字的实例数:

static int CountPairs(int[] array)
{
    var counter = new int[array.Length];

    foreach (var i in array)
    {
        counter[i] += 1;
    }

    var pairs = 0;

    foreach (var count in counter)
    {
        pairs += count / 2;
    }

    return pairs;
}

那也可以解决问题。

当然,您可以将其推广为适用于任何事物,但是简单的数组将不再起作用,您需要一些更复杂的东西:字典。但是这个想法和以前的解决方案是一样的。只需跟踪您看到任何给定项目的次数即可:

static int CountPairs<T>(IEnumerable<T> source)
{
    var counter = new Dictionary<T, int>();

    foreach (var item in source)
    {
        if (!counter.TryAdd(item, 1))
            counter[item] += 1;
    }

    var pairs = 0;

    foreach (var count in counter.Values)
    {
        pairs += count / 2;
    }

    return pairs;
}

但是...嗯,一旦在这里,简单地使用linq单线可能更好;)

答案 1 :(得分:0)

使用Linq非常简单:

var result = array.GroupBy(x => x).Select(x => new {num = x.Key, count = x.Count() / 2});
foreach(var item in result)
    Consolve.WriteLine($"{item.count} pair(s) of {item.num}");

要获取总对数:

int total = array.GroupBy(x => x).Sum(x => x.Count());
Consolve.WriteLine($"{total} pair(s) in total");