最大递增序列
Maximal increasing sequence
我试图编写一个程序来查找数组中相等元素的最大序列。例如:
输入: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();
两个列表都被清除了。
那是因为你将 tempSequence 赋给了序列:
sequence = tempSequence
在 C# 中,对象通过引用传递。当您清除 tempSequence 时,您将清除序列。
sequence = tempSequence
使序列成为与 tempSequence 相同的对象,因此对其中一个所做的每个更改也适用于另一个。
正如其他人所指出的,List
是一种引用类型,因此赋值是通过引用进行的。这意味着两个变量都在更改相同的底层对象(因此 .Clear
清除了两个列表)。
解决方案是制作一个具有相同内容的单独对象(也称为深拷贝)。 List
提供了一个构造函数 public List(IEnumerable<T> collection)
,它从另一个集合 (List
) 复制元素。
在您的代码中,将 sequence = tempSequence;
替换为
sequence = new List<string>(tempSequence);
看到这个.NET Fiddle
我试图编写一个程序来查找数组中相等元素的最大序列。例如:
输入: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();
两个列表都被清除了。
那是因为你将 tempSequence 赋给了序列:
sequence = tempSequence
在 C# 中,对象通过引用传递。当您清除 tempSequence 时,您将清除序列。
sequence = tempSequence
使序列成为与 tempSequence 相同的对象,因此对其中一个所做的每个更改也适用于另一个。
正如其他人所指出的,List
是一种引用类型,因此赋值是通过引用进行的。这意味着两个变量都在更改相同的底层对象(因此 .Clear
清除了两个列表)。
解决方案是制作一个具有相同内容的单独对象(也称为深拷贝)。 List
提供了一个构造函数 public List(IEnumerable<T> collection)
,它从另一个集合 (List
) 复制元素。
在您的代码中,将 sequence = tempSequence;
替换为
sequence = new List<string>(tempSequence);
看到这个.NET Fiddle