计算成对的元素[英] Counting pairs of elements

问题描述

您好,我有一个类似 1,1,2,2,1,1,2,2,1,3,3,3,3,3,4,4 的数组,我需要数一下有多少在该数组中乘以彼此相距 d 的一对元素.例如 d=2, x[0]=1;x[0+d]=2;对于 1-2 对,我们在数组中有 4 次出现;
这个问题困扰着我,它一定很容易,但我找不到答案.而且阵列会非常大,所以它也必须很快.你能帮我吗?

推荐答案

嗯,我想这应该不难吧?
您首先要弄清楚您的第一个数字是多少,在您的示例 1 中,然后检查指定索引处的数字.
现在创建一个 for 循环来检查任何数字,它是否与您的第一个数字相同,以及是否还检查当前索引 + 指定索引.
像这样的:
static int GetNumberOfPairs(IEnumerablearr, int 距离){int counter = 0;// 检查您的收藏是否足够大,可以开始使用.if (arr.Count() > 距离){//获取你需要的数字.int firstNo = arr.ElementAt(0);int secondNo = arr.ElementAt(distance);//循环遍历集合,添加时停止//索引会导致OutOfRangeException.for (int i = 0; i< arr.Count() - 距离;i++){//如果当前索引匹配第一个数字,// 然后还要检查当前索引+距离是否是第二个数字.if (arr.ElementAt(i) == firstNo && arr.ElementAt(i + distance) == secondNo){//如果是递增计数器.计数器++;}}}//返回计数器.返回 计数器;}</int>
我不是 C# 程序员,如果代码看起来很奇怪,请见谅...
您可能需要稍微调整一下这段代码,因为我没有对它进行太多测试.但它与您的示例相匹配.
另外,我并不是说这是解决方案.这是一个解决方案.可能还有其他可能更好的解决方案.不过,这肯定(可能)最简单:)
希望这会有所帮助!

出于好奇,我尝试了其他方法来解决这个问题——正如 Naerling
所提到的
//模式传达 - 第一个数字后跟 d 个其他数字,然后是第二个数字//firstNo="1";secondNo="2";距离="2";所有 firstNo,secondNo,distance 都是字符串.正则表达式 regexObj=new Regex(firstNo + @"\d{" + 距离 + "}" + secondNo);//匹配集合获取该正则表达式的所有出现MatchCollection MatchObj = regexObj.Matches("1122112213333344");//只打印出现次数!Console.WriteLine(MatchObj.Count);


感觉很优雅,而且我已经尝试过了,它的工作正常.

你可以试试这个方法,让我知道它适合你的问题吗?

PS:这需要使用 System.Text.RegularExpressions 库.

怎么样:

int[] arr = {2, 1, 1, 2, 2, 1, 3, 3, 3, 3, 3, 4, 4};int d = 2;int a = 1int b = 2;var e = arr.Skip(d).GetEnumerator();int m = arr.Take(arr.Length-d).Count(v=>e.MoveNext() && v==a && e.Current==b);


并不是说我真的会这样编程... ;-)

干杯

安迪

本文地址:https://www.itbaoku.cn/post/1395106.html