【问题标题】:Rotate a char array旋转一个字符数组
【发布时间】: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 数组

【问题讨论】:

标签: c# arrays rotation


【解决方案1】:

使用泛型并就地旋转(感谢 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 个项目,这个几乎和你的示例方法一样快。

【讨论】:

  • 根据 OP 的原始代码,您有什么理由没有原地旋转? (Array.Copy 可以正常工作。)
  • 我没想到。我会以另一种方式进行编辑。
  • 不错,但比简单的 c[0] = c[1]; 慢两倍;
  • 这个性能真的是你程序的问题吗?不要在不需要时进行微优化。
【解决方案2】:

旋转数组的另一种方法是在访问数组时旋转索引,即您正在创建一个虚拟环

int origin = someValue;
int x = c[(i + origin) % c.Length];

【讨论】:

  • 很好,但我正在寻找物理旋转
【解决方案3】:

我不确定您是要更有效的方法还是更简单的输入方法,但我会尝试回答您,假设您想要更简单的方法

那就试试吧:

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];
}

【讨论】:

    【解决方案4】:

    一步到位。

    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

    【讨论】:

    • 我正在寻找轮换而不是轮班
    • 不适用于超过 5 个(即数组长度)或负数
    【解决方案5】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多