我正在尝试解决问题,但似乎找不到正确的解决方法。例如: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++;
}
}
}
任何帮助都是可贵的。
答案 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");