在一行中给出一串数字,用 space 分隔

Give a string of numbers on a single line, separated by a space

在一行中给出一串数字,用 space 分隔。 接下来是 N 次操作,将字符串的一个元素移动到第一个位置。每个移动都在一行中指定,在该行中输入要移动到第一个位置的元素的索引。字符串的所有其他元素保持相同顺序。

将所有移动操作应用到第一个位置后,将修改后的字符串打印到控制台。然后在下一行打印 True 如果字符串的元素按升序排列,否则打印 False。该代码现在运行良好。

示例:

对于输入数据:

1 2 3 4 5 6
2
1
5

控制台将显示:

6 2 1 3 4 5

代码如下:


using System;
namespace MoveFirst
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] values = ReadValuesList();
            int[] positionsToMove = ReadPositions();

            for (int i = 0; i < positionsToMove.Length; i++)
                MoveFirst(values, positionsToMove[i]);

            PrintValuesList(values);
            Console.WriteLine(CheckIfSortedAscending(values));
            Console.Read();
        }

        static bool CheckIfSortedAscending(int[] values)
        {

            var result = true;
            for (int i = 0; i <= values.Length - 2; i++)
            {
                if (values[i] > values[i + 1])
                {
                    result = false;
                }
            }
            return result;
        }

        static void MoveFirst(int[] values, int index)
        {

            if (index == 1)
            {
                int aux = values[index - 1];
                values[0] = values[index];
                values[index] = aux;
            }
            else
            {
                int aux = values[index];
                for (int i = index; i > 0; i--)
                {
                    values[i] = values[i - 1];
                }
                values[0] = aux;
            }
        }

        static int[] ReadPositions()
        {
            int positionsNumber = Convert.ToInt32(Console.ReadLine());
            int[] positions = new int[positionsNumber];

            for (int i = 0; i < positionsNumber; i++)
                positions[i] = Convert.ToInt32(Console.ReadLine());

            return positions;
        }

        static int[] ReadValuesList()
        {
            string[] inputValues = Console.ReadLine().Split(' ');
            int[] values = new int[inputValues.Length];

            for (int i = 0; i < values.Length; i++)
                values[i] = Convert.ToInt32(inputValues[i]);

            return values;
        }

        static void PrintValuesList(int[] valuesList)
        {
            for (int i = 0; i < valuesList.Length; i++)
                Console.Write(valuesList[i] + " ");
            Console.Write('\n');
        }
    }
}

首先,你会得到一个编译错误,因为并非所有代码路径 return 都是一个值,正如它所说的那样。假设您的数组长度为 0,程序将永远不会进入循环。在这种情况下 return 会怎样?您还应该 return 循环之外的东西,但无论如何这不是您想要的。您的代码将只检查前两个值,因为您在第一次比较后将其设置为 return 。您需要的是:

var result = true;
for (int i = 0; i <= values.Length-2; i++)
{
  if (values[i]>values[i+1])
  {
    result = false;
  }
}
return result;

这将检查整个数组,因为它 return 是检查后的值。我还更改了循环中的比较。想象一个包含 10 个元素的数组。当i=8时,需要比较元素9和10(values[8],values[9])。最后,这将适用于数组有 2 个元素的边缘情况,如果它有一个元素,它将 return 为真。

编辑:您还可以执行以下操作,效率更高:

for (int i = 0; i <= values.Length-2; i++)
{
  if (values[i]>values[i+1])
  {
    return false;
  }
}
return true;

但因为我认为这是某种作业,所以第一种方法可能更好。