在一行中给出一串数字,用 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;
但因为我认为这是某种作业,所以第一种方法可能更好。
在一行中给出一串数字,用 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;
但因为我认为这是某种作业,所以第一种方法可能更好。