0

我正在尝试编写一个遍历数组的函数,当它找到某种类型的值时,它将向右移动定义数量的位置。

我知道如何通过临时存储一个值来移动元素,将右侧元素向左移动,然后将临时值写入正确的位置。

我正在苦苦挣扎的一点是,如果某个字符出现在数组的末尾附近,我需要它环绕并从数组的开头继续,所以是循环的。

例如,一个数组将大写字母向右移动 3 位,特殊字符向左移动 1 位:

{ M, y, N, a, m, e, P} becomes...
{ y, M, P, a, N, m, e}

要将 8 的元素移动到下面的 3 个位置,但这仅适用于 8 出现在数组末尾的 3 个元素之前并且不会环绕的情况。

输入数组:

{0, 1, 2, 3, 4, 5, 6, 7, **8**, 9}

所需的输出:

{0, **8**, 1, 2, 3, 4, 5, 6, 7, 9}
int[] array = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

for (int i = array.Length - 1; i >= 0; i--) 
{
    if (array[i] == 8) 
    {
        int temp = array[i];
        int j = 0;
        for (j = i; j < i + 3; j++) 
        {
            array[j] = array[j + 1];
        }
        array[j] = temp;
    }
}
4

2 回答 2

2

只需使用模算术,以便在j移位时写入 index 处的元素,而不是写入 index 处的元素j % array.Length。因此:

public void FindAndShift<T>(T[] array, T value, int shift) {
    int index = Array.IndexOf(array, value);
    int shiftsRemaining = shift;
    for(int currentPosition = index; shiftsRemaining > 0; shiftsRemaining--) {
        array[currentPosition % array.Length] = array[(currentPosition + 1) % array.Length];
    }
    array[(index + shift) % array.Length] = value;
}

我已经排除了错误检查。

于 2011-04-17T19:09:17.780 回答
0

您可以使用 if 语句来执行此操作,检查数组末尾是否有足够的空间,如果不是,您还必须计算在数组开头移动多少步。

我还认为,您可以通过在进行移位时计算以数组长度为模的位置来做到这一点,我目前无法尝试,但我脑海中的逻辑表明它应该可以工作。

于 2011-04-17T19:06:24.140 回答