具有一个固定值的旋转阵列

时间:2015-04-25 09:24:28

标签: c# arrays rotation

我建立了一个强大的逻辑和随机化的keygen,基于部分密钥验证'。我需要通过旋转数组添加另一个随机函数,但我在Stack Overflow找到的所有样本都有不同的需求。

我从数组开始:

   int[] q = new int[5];
   for (int i = 0; i < q.Length; i++)
   {
       q[i] = i;
   }

现在我有:

q[0] = 0;
q[1] = 1;
q[2] = 2;
q[3] = 3;
q[4] = 4;

我需要顺时针方向,但我需要保持一个值不可变,例如q [2] = 2;

然后应该产生第一步(顺时针加上+ 1):

q[0] = 1;
q[1] = 3; //bypassed 2nd value
q[2] = 2;
q[3] = 4;
q[4] = 0; //come back to 0

第二步应该是(顺时针再加+ 1):

q[0] = 3; //bypassed 2nd value
q[1] = 4; 
q[2] = 2;
q[3] = 0; //come back to 0
q[4] = 1;

如果可能的话,我还需要回滚功能......非常感谢

感谢您的帮助:同时我创建了我的解决方案:

        for (int i = 0; i < q.Length; i++)
        {
            if (i == fixed_int) { } //donothing
            else if ((q[i] + 1) == fixed_int) { q[i] = q[i] + 2; }
            else if ((q[i] + 1) == (q.Length + 1)) { q[i] = 0; }
            else { q[i] = q[i] + 1; }
        }

如果Fix值没有2更多int向前,这将失败,但它不是我的情况。请不要使用此代码,因为它在某些情况下不起作用。使用接受的答案,因为它摇滚!

2 个答案:

答案 0 :(得分:0)

假设数组至少包含2个元素,您可以尝试这样的方法(将step设置为+1-1进行不同的旋转):

void Rotate(int[] a, int fix, int step)
{
    int i = (fix + step + a.Length) % a.Length;
    int n = (fix - step + a.Length) % a.Length;
    int t = a[i];
    while(i != n)
    {
        int j = (i + step + a.Length) % a.Length;
        a[i] = a[j];
        i = j;
    }
    a[n] = t;
}

答案 1 :(得分:0)

这是一个可以用来实现结果的通用函数:

public static T[] Rotate<T>(T[] array, int fix)
{
    // check for errors
    if (array == null) throw new ArgumentNullException("array");
    if (fix < 0 || fix > array.Length - 1) throw new IndexOutOfRangeException();

    T[] result = new T[array.Length];

    // copy the input into the results
    Array.Copy(array, 1, result, 0, array.Length - 1);
    result[array.Length - 1] = array[0];

    // restore the location of the fixed item
    int j = ((fix - 1) + array.Length) % array.Length; // index of "fix - 1"
    result[j] = result[fix];
    result[fix] = array[fix];

    return result;
}

以下是随附的回滚功能:

public static T[] Rollback<T>(T[] array, int fix)
{
    // check for errors
    if (array == null) throw new ArgumentNullException("array");
    if (fix < 0 || fix > array.Length - 1) throw new IndexOutOfRangeException();

    T[] result = new T[array.Length];

    // copy the input into the results
    Array.Copy(array, 0, result, 1, array.Length - 1);
    result[0] = array[array.Length - 1];

    // restore the location of the fixed item
    int skp = ((fix + 1) + array.Length) % array.Length;
    result[skp] = result[fix];
    result[fix] = array[fix];

    return result;
}

可以按如下方式使用:

var input = new[] {0, 1, 2, 3, 4};
var result = Rotate(input, 2);      // yields {1, 3, 2, 4, 0}
var rollback = Rollback(result, 2); // yields {0, 1, 2, 3, 4}

还要记住,此函数是通用的,因此它可以使用任何类型的数组(在下面用char数组演示)。

var charArr = "abcdef".ToCharArray();
var charRslt = Rotate(charArr, 3);    // {'b', 'c', 'e', 'd', 'f', 'a'}
var charRlbk = Rollback(charRslt, 3); // {'a', 'b', 'c', 'd', 'e', 'f'}