你知道如何在不改变其他元素顺序的情况下将元素移动到第一个位置吗?
Do you know how to move elements to first position, without changing other elements order?
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)
{
for (int i = 1; i < values.Length; i++)
if (values[i - 1] > values[i])
return false;
return true;
}
public static void MoveFirst(int[] values, int index)
{
var temp = values[0];
values[0] = values[index];
values[index] = temp;
}
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');
}
}
}
这是我的全部代码,但我对结果有疑问。我可以得到一些关于如何更正 MoveFirst 方法中的代码的建议吗?
在一行中给出了一系列数字,由 space 分隔。有 N 次操作将字符串元素移动到第一个位置。每次移动都在一行上指定(必须移动到第一个位置的元素的索引),但字符串的所有其他元素保持不变订单。
例如,如果用户输入:1 2 3 4 5 6
1
5
结果应该是:6 2 1 3 4 5
我的结果是:6 1 3 4 5 2
这是工作示例,使用 LinkedList<int>
输入:
1 2 3 4 5 6
2
1
5
结果:
6 2 1 3 4 5
using System;
using System.Collections.Generic;
using System.Linq;
namespace MoveFirst
{
class Program
{
static void Main(string[] args)
{
LinkedList<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(IEnumerable<int> valuesList)
{
var prevValue = int.MinValue;
foreach (int value in valuesList)
{
if (prevValue > value)
return false;
prevValue = value;
}
return true;
}
public static void MoveFirst(LinkedList<int> values, int index)
{
if (index == 0 || index >= values.Count)
return;
var node = values.First;
for (var i = 0; i < index; i++)
node = node.Next;
values.Remove(node);
values.AddFirst(node);
}
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 LinkedList<int> ReadValuesList()
{
return new LinkedList<int>(Console.ReadLine().Split(' ').Select(Int32.Parse));
}
static void PrintValuesList(IEnumerable<int> valuesList)
{
foreach (int value in valuesList)
Console.Write(value + " ");
Console.Write('\n');
}
}
}
更新:
MoveFirst
强制使用数组时的方法。
public static void MoveFirst(int[] values, int index)
{
if (index == 0 || index >= values.Length)
return;
var temp = values[index];
for (int i = index - 1; i >=0; i--)
values[i + 1] = values[i];
values[0] = temp;
}
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)
{
for (int i = 1; i < values.Length; i++)
if (values[i - 1] > values[i])
return false;
return true;
}
public static void MoveFirst(int[] values, int index)
{
var temp = values[0];
values[0] = values[index];
values[index] = temp;
}
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');
}
}
}
这是我的全部代码,但我对结果有疑问。我可以得到一些关于如何更正 MoveFirst 方法中的代码的建议吗?
在一行中给出了一系列数字,由 space 分隔。有 N 次操作将字符串元素移动到第一个位置。每次移动都在一行上指定(必须移动到第一个位置的元素的索引),但字符串的所有其他元素保持不变订单。
例如,如果用户输入:1 2 3 4 5 6
1
5
结果应该是:6 2 1 3 4 5
我的结果是:6 1 3 4 5 2
这是工作示例,使用 LinkedList<int>
输入: 1 2 3 4 5 6
2
1
5
结果: 6 2 1 3 4 5
using System;
using System.Collections.Generic;
using System.Linq;
namespace MoveFirst
{
class Program
{
static void Main(string[] args)
{
LinkedList<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(IEnumerable<int> valuesList)
{
var prevValue = int.MinValue;
foreach (int value in valuesList)
{
if (prevValue > value)
return false;
prevValue = value;
}
return true;
}
public static void MoveFirst(LinkedList<int> values, int index)
{
if (index == 0 || index >= values.Count)
return;
var node = values.First;
for (var i = 0; i < index; i++)
node = node.Next;
values.Remove(node);
values.AddFirst(node);
}
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 LinkedList<int> ReadValuesList()
{
return new LinkedList<int>(Console.ReadLine().Split(' ').Select(Int32.Parse));
}
static void PrintValuesList(IEnumerable<int> valuesList)
{
foreach (int value in valuesList)
Console.Write(value + " ");
Console.Write('\n');
}
}
}
更新:
MoveFirst
强制使用数组时的方法。
public static void MoveFirst(int[] values, int index)
{
if (index == 0 || index >= values.Length)
return;
var temp = values[index];
for (int i = index - 1; i >=0; i--)
values[i + 1] = values[i];
values[0] = temp;
}