最大增加序列

时间:2015-04-13 16:41:07

标签: c# arrays algorithm sequence sequences

我试图创建一个程序,找到数组中相等元素的最大序列。例如:

输入: 2,1,1,2,3,3, 2,2,2 ,1

结果: 2,2,2

using System;
using System.Collections.Generic;

class MaximalSequence
{
    static void Main()
    {
        string[] array = Console.ReadLine().Split(new[] { ", " }, StringSplitOptions.None);
        string previous = string.Empty;
        List<string> sequence = new List<string>();
        List<string> tempSequence = new List<string>();
        for (int i = 0; i < array.Length; i++)
        {
            if (array[i] != previous)
            {
                tempSequence.Add(previous);
                if (tempSequence.Count > sequence.Count)
                {
                    sequence = tempSequence;
                }
                tempSequence.Clear();
            }
            else
            {
                tempSequence.Add(previous);
            }
            previous = array[i];
        }
        Console.WriteLine(string.Join(", ", sequence));
    }
}

问题是由于某种原因tempSequence.Clear();两个列表都被清除了。

3 个答案:

答案 0 :(得分:1)

正如其他人所指出的那样,List是一种引用类型,因此赋值通过引用分配。这意味着两个变量都在更改相同的底层对象(因此.Clear清除两个列表)。

解决方案是制作具有相同内容的单独对象(也称为深拷贝)。 List提供了一个构造函数public List(IEnumerable<T> collection),用于复制另一个集合(List)中的元素。

在您的代码中,将sequence = tempSequence;替换为

sequence = new List<string>(tempSequence);

请参阅此.NET Fiddle

答案 1 :(得分:0)

这是因为你将tempSequence分配给序列:

sequence = tempSequence

在c#中,对象通过引用传递。清除tempSequence后,清除序列。

答案 2 :(得分:0)

sequence = tempSequence使序列与tempSequence相同,因此对其中一个所做的每个更改也适用于另一个。