【发布时间】:2019-08-16 16:21:36
【问题描述】:
我尝试在一个大小为 n 的数组上实现左旋转。 例如,我有
数组 = {1,2,3,4,5};
我有班次:
班次 = 2;
处理完数组后,它必须如下所示:
数组 = {3,4,5,1,2};
我用两个 for 循环实现了它:
var array = new int[]{1,2,3,4,5};
var shifts =3;
var temp = 0;
for(var j = 0; j < shifts; j++){
temp = array[0];
for(var i = 0; i < array.Length -1; i++){
array[i] = array[i + 1];
}
array[array.Length-1] = temp;
}
for(var i =0 ; i< array.Length; i++){
System.Console.Write(array[i]+ " ");
}
Console.Read();
它正在工作,但它没有通过数组中有大量数字的一些测试,我得到因超时而终止错误;
有没有办法实现一循环左旋转?
【问题讨论】:
-
谷歌搜索 30 秒后:this
-
如果可以接受生成新数组,那么 Patrick 的解决方案对于大型数组会更快。如果您需要执行就地移位,那么您可以使用该解决方案的组合将第一个“移位”元素提取到临时数组中,然后在单个循环中循环遍历数组,通过“移位”移动元素,然后插入最后的临时值。
-
@PaulF,如果可以使用
IEnumerable<T>进一步操作,则可以通过排除.ToArray()来避免新数组。