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
我想进行适当的转换看来,
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;
}