这是一个基本问题(我是C#的新手),但是有一种有效的方法可以将第一个元素移动到C#中的数组末尾吗?
我发现了这个问题,它描述了.rotateruby 中的方法,但是我无法在C#中找到类似的方法.
如果我有一个数组:
[1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
C#中是否有一个函数返回:
[2, 3, 4, 5, 1]
Run Code Online (Sandbox Code Playgroud)
提前致谢!
编辑:答案
最好的解决方案是LinkedList<T>尽可能多地使用你建议的,如Alex的回答所示.他建议的解决方案是使用:
list.AddLast(list.RemoveFirst());
Run Code Online (Sandbox Code Playgroud)
可以在for循环中运行:
void func<T>(LinkedList<T> list, int rotate) {
for(var i = 0; i < rotate; i++) {
list.AddLast(list.RemoveFirst());
}
}
Run Code Online (Sandbox Code Playgroud)
感谢大家的帮助!
有很多方法可以实现这一目标.一种方法是:
var result = arr.Skip(1).Concat(arr.Take(1))
Run Code Online (Sandbox Code Playgroud)
如果你使用LinkedList<T>而不是array<T>你可以使用这个:
list.AddLast(list.RemoveFirst());
Run Code Online (Sandbox Code Playgroud)
复杂性O(1).当您多次执行此操作时:
void func<T>(LinkedList<T> list, int rotate) {
for(var i = 0; i < rotate; i++) {
list.AddLast(list.RemoveFirst());
}
}
Run Code Online (Sandbox Code Playgroud)
你会有一个复杂的O(N)[ N旋转次数].这是性能方面的最佳解决方案.
如果你真的需要使用数组,这可能是一个天真的解决方案:
var tmp = list[0];
for(var i = 1; i < list.Length; i++) {
list[i - 1] = list[i];
}
list[list.Length - 1] = tmp;
Run Code Online (Sandbox Code Playgroud)
(请注意,没有范围检查)
但如果您经常需要这样做,这将非常耗时.如果您多次执行此操作:
void func<T>(T[] list, int rotate) {
for(var j = 0; j < rotate; j++) {
var tmp = list[0];
for(var i = 1; i < list.Length; i++) {
list[i - 1] = list[i];
}
list[list.Length - 1] = tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
最终会得到O(N^2) = O(N * M)[ N元素M数量和旋转次数].这真的很糟糕.一个更好的方法,如果你提前知道你经常会这样做:
void func<T>(T[] list, int rotate {
for(var j = 0; j < list.Length; j++) {
var tmp = list[j];
var ix = (rotate + j) % list.Length;
list[j] = list[ix];
list[ix] = tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
这将导致O(N)[ N元素数量在哪里].
正如其他人已经建议的那样,如果您需要在多个位置使用此扩展方法,那么最好编写扩展方法.
| 归档时间: |
|
| 查看次数: |
3168 次 |
| 最近记录: |