【问题标题】:Last number in an array becomes first数组中的最后一个数字成为第一个
【发布时间】:2019-07-17 16:39:18
【问题描述】:

我知道这很容易,但我不明白我应该怎么做。

 1 23 29 18 43 20 5 

 5 1 23 29 18 43 20 

我认为我们应该使用for循环:

for (int i = 0; i < numbers.Count - 1; i++)
{

}

但我不知道该怎么做。类似 numbers[i] = numbers[i - 1] 但它不起作用。我认为有一些我想念的 if 检查。

【问题讨论】:

  • 使用临时变量,代码应该执行以下操作: temp = array[0], array[0] = array[6], array[6] = array[5], array[5] =数组[4],数组[4] = 数组[3],数组[3] = 数组[2],数组[2] = 数组[1],数组[1] = 温度
  • 让我问你一个问题:你认为numbers[i] = numbers[i + 1] 是做什么的?它会将数组元素复制/移动到左侧还是右侧?你为什么会这样想? (我认为数组索引 0 在左边,最大数组索引在右边)
  • @elgonzo 我认为它会将数组元素向右移动,但我错了。现在我明白为什么我应该使用 i - 1 (它会将数组元素移动到之前的位置)

标签: c# arrays .net list


【解决方案1】:

想到的最直接的方法是反向循环。

int[] numbers = { 1, 23, 29, 18, 43, 20, 5};
int lastVal = numbers[numbers.Length - 1];
for (int i = numbers.Length -1; i > 0; i--)
    numbers[i] = numbers[i-1];
numbers[0] = lastVal;

只是从末尾循环(保存最后一个值之后)并“向上”移动值,最后用最后一个值替换第一个值

【讨论】:

  • 谢谢!非常感谢您的帮助。
【解决方案2】:

这是一个单线:

var numbers = new[] {1, 23, 29, 18, 43, 20, 5};
numbers = new[] {numbers.Last()}.Concat(numbers.Take(numbers.Length - 1)).ToArray();

这会创建一个包含最后一个元素的新数组,然后将它与不包括最后一个元素的原始数组连接起来。

【讨论】:

  • 聪明,不幸的是 ToArray 对性能的打击很小。 (并不是说这在这里真的很重要)
  • 谢谢!同意,在更大范围内,绝对应该考虑内存使用情况,并且由于这个问题可能与学习任务有关,因此绝对值得注意,但正如您所说,这种情况下的影响可以忽略不计。
  • 谢谢!非常感谢您的帮助。
【解决方案3】:

您要做的是创建另一个与原始数组大小相同的数组,然后分配最后一个元素并在数组中循环直到前一个元素到最后一个元素。

类似这样的:

int[] original = {1, 23, 29, 18, 43, 20, 5};
int[] altered = new int[original.length];

altered[0] = original[original.length - 1];
for (int i = 1; i < original.length - 1; i++)
{
    altered[i] = original[i - 1];
}

【讨论】:

  • 谢谢!非常感谢您的帮助。
【解决方案4】:

您可以在您的箱子上将桌子向左旋转六个位置并创建请求的新桌子

 int[] myArray = new int[] { 1, 23, 29, 18, 43, 20, 5 };
 var newArray = LeftRotationByD(myArray, 6);

你的轮换函数是:

 private static int[] LeftRotationByD(int[] a, int k)
        {
            int[] b = new int[a.Length];

            int index;
            int length = a.Length;
            int place;

            for (int i = 0; i < length; i++)
            {
                index = i - k;
                place = length + index;

                if (index >= 0) b[index] = a[i];
                else b[place] = a[i];
            }
            return b;
        }

【讨论】:

  • 谢谢!非常感谢您的帮助。
【解决方案5】:

你可以用这个方法右移:

void ShiftRight(int[] array, int count)
{
    var clone = (int[])array.Clone();
    for (var i = 0; i < array.Length; i++)
        array[(i + count) % array.Length] = clone[i];
}

并以这种方式使用它:

var a = new int[] { 1, 2, 3, 4 };
ShiftRight(a, 1);

【讨论】:

  • 谢谢!非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
相关资源
最近更新 更多