如何移动一个数组元素绕
本文关键字:一个 数组元素 移动 何移动 | 更新日期: 2023-09-27 17:50:20
我正在尝试编写一个函数,该函数通过数组迭代,当它找到某种类型的值时,它将向右移动一个定义的位置。
我知道如何通过临时存储一个值来移动元素,将右边的元素移到左边,然后在正确的位置写入临时值。
我正在努力的是,如果某个字符出现在数组末尾附近,我需要它环绕并从数组开始继续,所以是循环的。
一个数组,例如,大写字母向右移动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;
}
}
只需使用模运算,以便在移位时不写入索引为j
的元素,而是写入索引为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;
}
我已经排除了错误检查
你可以用if语句来做,检查在数组结束前是否有足够的空间,如果没有,你必须计算在数组开始时移动多少步。
我也认为你可以通过计算位置模取数组的长度来做到这一点当你做移动时,我现在不能尝试但我脑子里的逻辑说它应该工作