我正在学习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);
}
}
}
我正在尝试仅返回最长数组的长度
最佳答案
编辑:您的代码的问题是最长的列表是最后一个子列表时,它不处理边缘情况
更改
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);
这实际上是使用元组遍历集合以存储2个列表,
Item1
表示最长的先前序列,Item2
表示当前序列。对于每个项目,如果当前序列不为空并且第一项不同,那么我们在新的子列表中,因此请检查最后一个序列的长度,如果更长的时间超过了先前的最大值,我们将替换先前的最大值,否则只需清除列表即可。
聚合的最后一部分检查两个列表中哪个更长(好像最长子集合是最后一个Item1长度检查不会发生)。
可以将此代码转换为通用函数,以处理以下任何类型。
IEnumerable<T> LongestSublist<T>(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);
甚至作为扩展功能
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 = new [] {1,2,2,3,4,4,4} .LongestSubList();