C# 如何在C中移动数组中的项?
假设我有一个字符串数组,如下所示:C# 如何在C中移动数组中的项?,c#,.net,arrays,C#,.net,Arrays,假设我有一个字符串数组,如下所示: 1, 2, 3, 4, 5, 6, 7, 8 我想移动数组的元素,这样 第一个元素始终保持不变 只有剩下的元素会像这样移动。。。 数组中的最后一个元素成为第二个元素,并随着每次传递在数组中移动。 通过1:1,2,3,4,5,6,7,8 通过2:1,8,2,3,4,5,6,7 通过3:1,7,8,2,3,4,5,6 通过4:1,6,7,8,2,3,4,5 非常感谢您的帮助。因为这看起来像是家庭作业,我不打算为您解决它,但我有几点建议: 如果数据不在其他地方,请
1, 2, 3, 4, 5, 6, 7, 8
我想移动数组的元素,这样
第一个元素始终保持不变
只有剩下的元素会像这样移动。。。
数组中的最后一个元素成为第二个元素,并随着每次传递在数组中移动。
通过1:1,2,3,4,5,6,7,8
通过2:1,8,2,3,4,5,6,7
通过3:1,7,8,2,3,4,5,6
通过4:1,6,7,8,2,3,4,5
非常感谢您的帮助。因为这看起来像是家庭作业,我不打算为您解决它,但我有几点建议: 如果数据不在其他地方,请记住不要覆盖数据。您需要一个临时变量。 尝试从头到尾遍历数组。这样的问题可能更简单,尽管可以从前面到后面进行。 请确保您的算法适用于任意长度的数组,而不仅仅是您的示例中给出的大小为8的数组。
因为这看起来像是家庭作业,所以我发布了一个不必要的复杂但非常时髦的LINQ解决方案:
int[] array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
int[] result = array.Take(1)
.Concat(array.Reverse().Take(1))
.Concat(array.Skip(1).Reverse().Skip(1).Reverse())
.ToArray();
在C中实现这一点的最快方法可能是使用Array.Copy。我对C语言中的指针知之甚少,所以可能有一种更快速的方法,可以避免数组边界检查等,但是下面的方法应该可以工作。它做了几个假设,不检查错误,但您可以修复它
void Shift<T>(T[] array) {
T last = array[array.Length-1];
Array.Copy(array, 1, array, 2, array.Length-2);
array[1]=last;
}
编辑
或者,还有Buffer.BlockCopy,它根据执行较少的验证,但在内部以相同的方式复制块。尽管听起来像其他人建议的家庭作业,但如果更改为列表,您可以通过以下操作获得所需内容
List<int> Nums2 = new List<int>();
for( int i = 1; i < 9; i++ )
Nums2.Add(i);
for (int i = 1; i < 10; i++)
{
Nums2.Insert( 1, Nums2[ Nums2.Count -1] );
Nums2.RemoveAt(Nums2.Count -1);
}
定义如下:
public static class Extensions
{
public static IEnumerable<T> Rotate<T>(this IEnumerable<T> enuml)
{
var count = enuml.Count();
return enuml
.Skip(count - 1)
.Concat(enuml.Take(count - 1));
}
public static IEnumerable<T> SkipAndRotate<T>(this IEnumerable<T> enuml)
{
return enum
.Take(1)
.Concat(
enuml.Skip(1).Rotate()
);
}
}
这里有一些重复的代码,您可能需要重构。当然,我还没有编译过这个,所以请注意 这与Josh Einstein的类似,但它将手动执行,并允许您指定在开始时保留多少元素
static void ShiftArray<T>(T[] array, int elementsToPreserve)
{
T temp = array[array.Length - 1];
for (int i = array.Length - 1; i > elementsToPreserve; i--)
{
array[i] = array[i - 1];
}
array[elementsToPreserve] = temp;
}
第一关:1 2 8 3 4 5 6 7这一定是家庭作业。这上面应该有家庭作业标签。安迪,询问家庭作业问题一般都可以。看这个:你为什么说它必须是家庭作业?这是一个非常实用的问题。@Josh Einstein-因为它看起来很像家庭作业问题或面试问题,因为它是一个展示数组操作基本概念的玩具问题。如果你能改变数据结构,LinkedList可能是一个更好的选择。@Andy-你能提供你已经尝试过的代码吗。人们更容易更正代码,然后从头开始编写。此外,这表明你已经尝试了一些东西,而不仅仅是在寻找给你的答案。LinkedList会在更大的集合中提供更好的性能。我同意。。。更简单的链表-甚至双链接的逆转能力
static void ShiftArray<T>(T[] array, int elementsToPreserve)
{
T temp = array[array.Length - 1];
for (int i = array.Length - 1; i > elementsToPreserve; i--)
{
array[i] = array[i - 1];
}
array[elementsToPreserve] = temp;
}
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8 };
ShiftArray(array, 2);