【问题标题】:Numbers wont follow when shifting array to the left将数组向左移动时数字不会跟随
【发布时间】:2019-10-24 08:32:37
【问题描述】:

数字可以向左移动 => 检查。

只有数组中的第一个数字跟随,其余的消失。
例如现在的情况:

输入数组:1 2 3 4 5 6
输入左移多少次:3
输出:4 5 6 1
输出应该如何:4 5 6 1 2 3

有人可以帮助解决这个我找不到的可能简单的解决方案。

var str = Console.ReadLine();
int shift = Convert.ToInt32(Console.ReadLine());
var strArray = str.Split(' ');
var x = strArray[0];

for (var i = 0; i < strArray.Length - shift; i++)
{
    strArray[i] = strArray[i + shift];
}

strArray[strArray.Length - shift] = x;

for (var i = 0; i <= strArray.Length - shift; i++)
{
    Console.Write(strArray[i] + ' ');
}

【问题讨论】:

  • 我建议您使用Visual Studio Debugger 看看您的程序,并逐步完成它 - 问题应该很快就会变得清晰。
  • 它变成了 4 5 6 因为你写数组的方式。如果您在最后一个循环中将条件更改为i &lt; strArray.Length,您会得到:4 5 6 1 5 6
  • 我的控制台变成了 4 5 6 1?不是 4 5 6
  • 请注意,您的代码只处理向左移动的数字,它不处理环绕到另一端的数字。
  • @John 已经非常感谢您帮助我。确实,您的答案显示4 5 6 1 5 6。这几乎是正确的,现在最后 2 个数字需要变为 2 3

标签: c# arrays shift


【解决方案1】:

您可以使用 Linq 执行轮班,这是您可以使用的简单方法

    public int[] shiftRight(int[] array, int shift)
    {
        var result = new List<int>();
        var toTake = array.Take(shift);
        var toSkip = array.Skip(shift);

        result.AddRange(toSkip);
        result.AddRange(toTake);

        return result.ToArray();
    }

【讨论】:

    【解决方案2】:

    这是为您提供的快速解决方案。请检查以下代码。

    我将元素向左移动 1 个位置,您可以根据需要更改代码。

    输入数组:1 2 3 4 5 6

    输入左移次数:1

    输出:2 3 4 5 6 1

        int[] nums = {1, 2, 3, 4, 5, 6};
        Console.WriteLine("\nArray1: [{0}]", string.Join(", ", nums));
        var temp = nums[0];
        for (var i = 0; i < nums.Length - 1; i++)
        {
            nums[i] = nums[i + 1];
        }
        nums[nums.Length - 1] = temp;
        Console.WriteLine("\nAfter rotating array becomes: [{0}]", string.Join(", ", nums));
    

    【讨论】:

      【解决方案3】:

      如果这仅适用于字符串并且需要环绕,我建议使用str.Substring(0,shift) 并将其附加到str.Substring(shift)(不要试图重新发明轮毂) (关于子字符串方法的一些信息:String.Substring

      否则它不起作用的原因是因为您只保存了数组的第一个值,而不是您想要移动的所有值。


      不要只保存数组中的第一个值

      var x = strArray[0];
      

      使用

      string[] x = new string[shift];
      for (int i = 0; i < shift; i++)
      {
          x[i] = strArray[i];
      }
      

      而是收集所有需要添加到末尾的值。

      编辑:忘记换档

      将旧数据左移

      for (int i = 0; i < strArray.Length-shift; i++)
      {
          strArray[i] = strArray[i+shift];
      }
      

      并替换

      strArray[strArray.Length - shift] = x;
      

      for(int i = 0; i < x.Length; i++){
          int newlocation = (strArray.Length - shift)+i;
          strArray[newlocation] = x[i];
      }
      

      也将打印循环替换为

      Console.WriteLine(string.Join(" ", strArray));
      

      它更简单,只需一行而不是三行代码。

      (也是加入函数string.Join的文档)

      【讨论】:

      • 谢谢,再次接近我的结果,但现在我的第一个只需要向左移动的数字改变了输入:1 2 3 4 5 6 7 和 shifttimes:3 输出:1 2 3 4 1 2 3
      • @Batty 抱歉,我忘记在代码中将移位添加到左侧。我添加了将数据向左移动的代码
      猜你喜欢
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多