Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回重复成员C的最长子数组_C#_Arrays - Fatal编程技术网

C# 返回重复成员C的最长子数组

C# 返回重复成员C的最长子数组,c#,arrays,C#,Arrays,我正在学习C并试图解决以下问题: 返回重复成员的最长子数组,例如,如果数组为{1,2,2,3,4,4,4},我应该返回{4,4,4}。我试图这样做,但它返回第一个子数组,而不是最长的。到目前为止我对C的了解: 循环 条件句 阵列 有什么想法吗 编辑:到目前为止我的代码 编辑:是的,我确实知道一些关于多维数组的知识 using System; using System.Collections.Generic; using System.Linq; using System.Text; names

我正在学习C并试图解决以下问题: 返回重复成员的最长子数组,例如,如果数组为{1,2,2,3,4,4,4},我应该返回{4,4,4}。我试图这样做,但它返回第一个子数组,而不是最长的。到目前为止我对C的了解:

循环 条件句 阵列 有什么想法吗

编辑:到目前为止我的代码 编辑:是的,我确实知道一些关于多维数组的知识

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sequence
{
class Sequence
{
    static void Main(string[] args)
    { 
        Console.Write("Enter size:");
        int size1 = int.Parse(Console.ReadLine());
        int[] array1 = new int[size1];
        for (int i = 0; i <= size1-1; i++)
        {
            Console.Write ("Ënter Number:");
            array1[i]=Int32.Parse(Console.ReadLine());
        }
        int bestLenght = 0;
        int bestStart = 0;
        int lenght = 0;
        int start=0;
        for (int i = 0; i < size1 - 2; i++)
        {
            if (i == 0 && array1[i] == array1[i + 1])
            {
                start = 0;
                lenght = 2;
                if (bestLenght < lenght)
                {
                    bestLenght = lenght;
                    bestStart = 0;
                }
            }
            else if (i != 0 && lenght != 0 && array1[i] == array1[i - 1] && array1[i + 1]   ==              array1[i])
            {
                lenght++;
                if (bestLenght < lenght)
                {
                    bestLenght = lenght;
                    bestStart = start;
                }
            }
            else if (i != 0 && array1[i - 1] != array1[i] && array1[i] == array1[i + 1])
            {
                start = i;
                lenght = 2;
                if (bestLenght < lenght)
                {
                    bestLenght = lenght;
                    bestStart = start;
                }

            }
            else 
            {
                lenght = 0;
            }


        }
        Console.WriteLine(bestLenght);



    }
}
}


目前,我只是想返回最长数组的长度,基本上你需要做的就是检查前一个数是否与当前数相同,并相应地增加一个计数器

精确地说,在数组中循环,将值复制到一个新数组,当它循环时,仅当计数器值较高时才复制


希望这有助于检查前一个数字是否与当前数字相同,并相应地增加一个计数器

精确地说,在数组中循环,将值复制到一个新数组,当它循环时,仅当计数器值较高时才复制


希望这有帮助

您可以选择以下几种方法:

最简单的就是

查找列表中每个整数的所有匹配项 选择出现次数最多的一个。 使用Linq,如下所示:

var list = new List<int>{1,2,2,3,4,4,4} ;   
var result = list.GroupBy(r => r).OrderByDescending(grp => grp.Count()).First();
按数字分组,一组中有1个,另一组中有2个,。。。等等

b按每个元素的数量降序排列组,因此在我们的例子中,4将是第一个,因为4的组比任何其他组多3个元素

c获取列表中的第一个元素


您可以执行以下几个选项:

最简单的就是

查找列表中每个整数的所有匹配项 选择出现次数最多的一个。 使用Linq,如下所示:

var list = new List<int>{1,2,2,3,4,4,4} ;   
var result = list.GroupBy(r => r).OrderByDescending(grp => grp.Count()).First();
按数字分组,一组中有1个,另一组中有2个,。。。等等

b按每个元素的数量降序排列组,因此在我们的例子中,4将是第一个,因为4的组比任何其他组多3个元素

c获取列表中的第一个元素


一种非常迭代的方法:

循环遍历数组中的每个项。 如果当前项与上一项相同,则将currentSeriesLength增加1。 如果没有,请对照longestSeriesLength检查。如果较大,则将当前索引存储在LongestSeriesSend中,并将当前索引-currentSeriesLength存储在longestSeriesStart中。 将currentSeriesLength值保存在longestSeriesLength中。 将currentSeriesLength设置回1。 最长的系列将是介于longestSeriesStart和LongestSeriesSend之间的系列。
将其转换为代码对您来说是一个很好的练习。

一种非常迭代的方法,用文字表示:

循环遍历数组中的每个项。 如果当前项与上一项相同,则将currentSeriesLength增加1。 如果没有,请对照longestSeriesLength检查。如果较大,则将当前索引存储在LongestSeriesSend中,并将当前索引-currentSeriesLength存储在longestSeriesStart中。 将currentSeriesLength值保存在longestSeriesLength中。 将currentSeriesLength设置回1。 最长的系列将是介于longestSeriesStart和LongestSeriesSend之间的系列。
将其转换为代码将是一个很好的练习。

编辑:代码的问题在于,当最长列表是最后一个子列表时,它不处理边缘情况

改变

Console.WriteLine(bestLenght); 
阅读

if (lenght > bestLenght) {
  bestLenght=lenght;
  bestStart=start;
}
Console.WriteLine(bestLenght); 
或者

你可以用linq Agregate来做这件事

var x= new[] {1,2,2,3,4,4,4};
var y=x.Aggregate(Tuple.Create(new List<int>(),new List<int>()),
(a,b) =>{
   if (a.Item2.Count()>0 && a.Item2[0] != b) {
     if (a.Item2.Count>a.Item1.Count()) {
       a=Tuple.Create(a.Item2,new List<int>());
     }
     a.Item2.Clear();
   }
   a.Item2.Add(b);
   return a;
},a=>(a.Item2.Count() > a.Item1.Count()) ? a.Item2 : a.Item1);
甚至作为一个扩展函数

public static IEnumerable<T> LongestSublist<T>(this IEnumerable<T> source) {
return source.Aggregate(Tuple.Create(new List<T>(),new List<T>()),
    (a,b) =>{
       if (a.Item2.Count()>0 && a.Item2[0] != b) {
         if (a.Item2.Count>a.Item1.Count()) {
           a=Tuple.Create(a.Item2,new List<T>());
         }
         a.Item2.Clear();
       }
       a.Item2.Add(b);
       return a;
    },a=>(a.Item2.Count() > a.Item1.Count()) ? a.Item2 : a.Item1);
允许你做


var longest=新的[]{1,2,2,3,4,4}.最长子列表

EDIT:代码的问题在于,当最长列表是最后一个子列表时,它不处理边缘情况

改变

Console.WriteLine(bestLenght); 
阅读

if (lenght > bestLenght) {
  bestLenght=lenght;
  bestStart=start;
}
Console.WriteLine(bestLenght); 
或者

你可以用linq Agregate来做这件事

var x= new[] {1,2,2,3,4,4,4};
var y=x.Aggregate(Tuple.Create(new List<int>(),new List<int>()),
(a,b) =>{
   if (a.Item2.Count()>0 && a.Item2[0] != b) {
     if (a.Item2.Count>a.Item1.Count()) {
       a=Tuple.Create(a.Item2,new List<int>());
     }
     a.Item2.Clear();
   }
   a.Item2.Add(b);
   return a;
},a=>(a.Item2.Count() > a.Item1.Count()) ? a.Item2 : a.Item1);
甚至作为一个扩展函数

public static IEnumerable<T> LongestSublist<T>(this IEnumerable<T> source) {
return source.Aggregate(Tuple.Create(new List<T>(),new List<T>()),
    (a,b) =>{
       if (a.Item2.Count()>0 && a.Item2[0] != b) {
         if (a.Item2.Count>a.Item1.Count()) {
           a=Tuple.Create(a.Item2,new List<T>());
         }
         a.Item2.Clear();
       }
       a.Item2.Add(b);
       return a;
    },a=>(a.Item2.Count() > a.Item1.Count()) ? a.Item2 : a.Item1);
允许你做


var longest=新的[]{1,2,2,3,4,4}.最长子列表

所以,请展示一些您迄今为止尝试过的代码亲爱的回答者,作为一个初学者,请避免使用LINQ。您知道多维数组吗?如果我们给您一个解决方案,您将无法学习。如果你想让我们指出你的错误,就拿出你的代码。@BigYellowCactus:我知道,甚至我也可以给他,但我们的动机应该是增加他的逻辑性。阅读dystroy评论。所以请展示一些你迄今为止尝试过的代码亲爱的回答者,作为一个初学者,请避免使用LINQ。你知道多维数组吗?如果我们给你一个解决方案,你将无法学习。如果你想让我们指出你的错误,就拿出你的代码。@BigYellowCactus:我知道,甚至我也可以给他,但我们的动机应该是增加他的逻辑性。阅读Destroy注释。重复的数字可能相邻,也可能不相邻我们第一次只复制重复的数字重复的数字可能相邻,也可能不相邻我们第一次只复制重复的数字如果列表=新列表{1,2,2,1
,1,3,1,1,4,4}?@BobVale:它按数字分组,不关心列表中元素的顺序。OP说重复成员因此顺序很重要,你的代码将返回{1,1,1,1,1}而不是{4,4,4}@BobVale:理解你的观点,但我认为OP的意思是我回答的问题。只是用不太清楚的语言写了这个问题。。我考虑他所举的例子。实际上,我必须仔细阅读OP的代码,因为它看起来检查连续的序列…如果列表=新的列表{1,2,2,1,3,1,1,4,4,4 }?@ BobVale:它按数字分组,并且不关心List.OP中的元素顺序。{1,1,1,1,1}而不是{4,4,4}@ BobVale:你的观点,但我认为OP的意思是我回答的问题。只是用不太清楚的语言写这个问题。我认为他举的例子。真的,我一定是误读了OP的代码,因为它似乎检查了连续的序列……我学会了这样的方式…深端。人们应该学习LINQ尽快摆脱它。很多循环和嵌套的如果!对…必须…如果你觉得有任何有用的链接,请与我分享。我知道有很多链接suggestion@Peru尝试一下这是一个很好的开始,你甚至可以得到一个很好的简单IDE,我用它来编写大多数答案!我是这样学的…Deep end。人们应该尽快学习Linq,它可以摆脱如此多的循环和嵌套的ifs!Ri好的…如果你觉得有什么有用的链接,我必须…和我分享。我知道有很多链接suggestion@Peru尝试一下这是一个很好的开始,你甚至可以得到一个很好的简单IDE,我用它来编写大多数答案!