【发布时间】:2012-06-02 16:04:29
【问题描述】:
这种方法有什么替代方法
tmp = c[0];
c[0] = c[1];
c[1] = c[2];
c[2] = c[3];
c[3] = tmp;
向左旋转 4 个元素的 char 数组
【问题讨论】:
-
这和这个问题不是很相似。所以你想把整个数组左移,然后把前面的第一个元素加到最后。 stackoverflow.com/questions/2381245/…
这种方法有什么替代方法
tmp = c[0];
c[0] = c[1];
c[1] = c[2];
c[2] = c[3];
c[3] = tmp;
向左旋转 4 个元素的 char 数组
【问题讨论】:
使用泛型并就地旋转(感谢 Jon Skeet 的建议):
static void Rotate<T>(T[] source)
{
var temp = source[0];
Array.Copy(source, 1, source, 0, source.Length - 1);
source[source.Length - 1] = temp;
}
这些应该适用于任何长度至少为 2 的数组,并且适用于任何数组。
如果性能很关键并且数组总是很小,使用这个:
static void Rotate<T>(T[] source)
{
var temp = source[0];
for (int i = 0; i < source.Length - 1; i++)
source[i] = source[i + 1];
source[source.Length - 1] = temp;
}
第一种方法对于大型数组来说是最快的,但是对于 4 个项目,这个几乎和你的示例方法一样快。
【讨论】:
旋转数组的另一种方法是在访问数组时旋转索引,即您正在创建一个虚拟环
int origin = someValue;
int x = c[(i + origin) % c.Length];
【讨论】:
我不确定您是要更有效的方法还是更简单的输入方法,但我会尝试回答您,假设您想要更简单的方法
那就试试吧:
int temp = c[0]
for(int i = 0; i < c.count; i++)
{
if (i == (c.count - 1))
{
c[i] = temp;
break;
}
c[i] = c[i + 1];
}
【讨论】:
一步到位。
Using System.Linq;
int[] ar = { 1,2,3,4,5};
int k = 1; //
int[] ar1= ar.Skip(k) // Start with the last elements
.Concat(ar.Take(k)) // Then the first elements
.ToArray();
输出-- 2,3,4,5,1
【讨论】:
在 ruby 中旋转数组可以在一行中完成。
def array_rotate(arr)
i, j = arr.length - 1, 0
arr[j],arr[i], i, j = arr[i], arr[j], i - 1, j + 1 while(j<arr.length/2)
puts "#{arr}"
end
【讨论】: