Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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#_Algorithm_Linq_List_Arraylist - Fatal编程技术网

C# 如何移动列表中的数据

C# 如何移动列表中的数据,c#,algorithm,linq,list,arraylist,C#,Algorithm,Linq,List,Arraylist,我有下面的例子,我想得到一个没有重循环和切片的通用解决方案 首先: 我初始化N,通过它我计算列表大小(初始大小): 通过这个方程N(N-1)/2 假设我设置了N=5,那么初始大小将是10 然后我用某种方法用1和0填充列表 像这样: 0110110101 该列表根据N进行分段,其中分段为(N-1) 所以 第一段是:011 第二段是:110 第三段是:10 第四段是:1 [01101][1110][10][1] 我想做的是,如果我再次输入任意数字作为输入N: 使用正确的换档方式保持以前的数据 根

我有下面的例子,我想得到一个没有重循环和切片的通用解决方案

首先:

我初始化
N
,通过它我计算列表大小(初始大小):

通过这个方程
N(N-1)/2

假设我设置了
N=5
,那么初始大小将是
10

然后我用某种方法用1和0填充列表

像这样:

0110110101

该列表根据N进行分段,其中分段为(N-1)

所以

  • 第一段是:
    011
  • 第二段是:
    110
  • 第三段是:
    10
  • 第四段是:
    1
[01101][1110][10][1]

我想做的是,如果我再次输入任意数字作为输入N:

使用正确的换档方式保持以前的数据

根据新的大小。例如,如果N=6,则大小将为15

因此,我将有5段而不是4段

我想要这样:

[011010][11100][100][10]

反之,如果我先输入N=7,然后填写,然后输入N=4


我想进行适当的转换

看来,
LinkedList
是最适合您的收藏类。它使您能够在固定时间内从列表中的任何位置插入和删除元素

下面给出了将N增加和减少1的算法。这两个操作都是O(N)

//整数的整个列表
var data=newlinkedlist();
//存储每个段的最后一个节点
var segmentEnds=新链接列表();
/*增加*/
//将所有现有线段增加一个
var node=segmentEnds.First;
while(节点!=null)
{
node.Value=data.AddAfter(node.Value,0);
node=node.Next;
}
//添加大小为1的最后一段
segmentEnds.AddLast(data.AddLast(0));
/*减少*/
如果(data.Count>0)
{
//从每个段中删除最后一个元素
节点=段结束。首先;
while(节点!=null)
{
var temp=node.Value.Previous;
数据删除(节点值);
节点值=温度;
node=node.Next;
}
//删除最后一个(现在为空)段
segmentEnds.RemoveLast();
}

看来
LinkedList
是最适合您的收藏类别。它使您能够在固定时间内从列表中的任何位置插入和删除元素

下面给出了将N增加和减少1的算法。这两个操作都是O(N)

//整数的整个列表
var data=newlinkedlist();
//存储每个段的最后一个节点
var segmentEnds=新链接列表();
/*增加*/
//将所有现有线段增加一个
var node=segmentEnds.First;
while(节点!=null)
{
node.Value=data.AddAfter(node.Value,0);
node=node.Next;
}
//添加大小为1的最后一段
segmentEnds.AddLast(data.AddLast(0));
/*减少*/
如果(data.Count>0)
{
//从每个段中删除最后一个元素
节点=段结束。首先;
while(节点!=null)
{
var temp=node.Value.Previous;
数据删除(节点值);
节点值=温度;
node=node.Next;
}
//删除最后一个(现在为空)段
segmentEnds.RemoveLast();
}
int N=5;
var数组=可枚举。范围(1,N-1)。选择(i=>Fill(i))
.SelectMany(x=>x)
.ToArray();
int[]填充(int len)
{
int[]arr=新的int[len];
对于(int i=0;i
int N=5;
var数组=可枚举。范围(1,N-1)。选择(i=>Fill(i))
.SelectMany(x=>x)
.ToArray();
int[]填充(int len)
{
int[]arr=新的int[len];
对于(int i=0;i
您有什么理由必须将它们放在一个列表中?看起来这里有一个n个列表的列表,所以创建一个大小为n的列表,其中包含大小为1到n的列表。这样,当您增加N时,您只需向每个列表添加适当数量的0,并创建新列表,其中只有0。如果你减少N,我不确定规则是什么,但我怀疑通过比较,你只会删除适当数量的短列表,然后从其他列表中删除最后的元素


就拥有单个arraylist而言,它不起作用,但我认为它是存储您描述的数据的更好方法。不管怎样,你总是可以很容易地从我描述的模型中得到展开列表…

为什么你必须将它们放在一个列表中?看起来这里有一个n个列表的列表,所以创建一个大小为n的列表,其中包含大小为1到n的列表。这样,当您增加N时,您只需向每个列表添加适当数量的0,并创建新列表,其中只有0。如果你减少N,我不确定规则是什么,但我怀疑通过比较,你只会删除适当数量的短列表,然后从其他列表中删除最后的元素


就拥有单个arraylist而言,它不起作用,但我认为它是存储您描述的数据的更好方法。不管怎样,你总是可以很容易地从我描述的模型中得到展开的列表…

也许你应该开始从两个维度思考,使用
列表
,而
列表
。通过使用此功能,您应该能够轻松地添加/删除一个段,或者以您喜欢的方式更改所有段。但这在某种程度上会导致沉重的循环,但我不认为不在任何层面上循环就无法解决这个问题。

也许你应该开始从两个维度思考,使用
列表
,而
// the whole list of integers
var data = new LinkedList<int>();

// stores the final node of each segment
var segmentEnds = new LinkedList<LinkedListNode<int>>();

/* INCREASING */
// increase all existing segments by one
var node = segmentEnds.First;
while (node != null)
{
    node.Value = data.AddAfter(node.Value, 0);
    node = node.Next;
}

// add the last segment of size 1
segmentEnds.AddLast(data.AddLast(0));

/* DECREASING */
if (data.Count > 0)
{
    // remove the last element from each segment
    node = segmentEnds.First;
    while (node != null)
    {
        var temp = node.Value.Previous;
        data.Remove(node.Value);
        node.Value = temp;
        node = node.Next;
    }

    // remove the last (now empty) segment
    segmentEnds.RemoveLast();
}
int N = 5;
var array = Enumerable.Range(1, N - 1).Select(i => Fill(i))
                      .SelectMany(x => x)
                      .ToArray();

int[] Fill(int len)
{
    int[] arr = new int[len];
    for (int i = 0; i < len; i++) arr[i] = 1; //Fill
    return arr;
}
private static int MakeIndex(int r, int c, int N) {
    return (N*(N+1)-(N-r)*(N+1-r))/2+c;
}