c# - 你知道如何在不改变其他元素顺序的情况下将元素移动到第一个位置吗?
问题描述
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 方法中的代码吗?
在一行中给出了一系列数字,以空格分隔。将字符串元素移动到第一个位置有 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;
}
推荐阅读
- python - 如何配置 Chrome 浏览器以无头模式运行
- laravel - 存储/缓存 Discord 角色的最佳方式是什么?
- javascript - 如何播放使用 .toggleClass 在 Javascript 中切换的类的完整动画?
- postgresql - 带有 pgbouncer 表的 postgresql 未显示
- angular - 如何修复错误 TS2416:“KeycloakAuthGuard”类型中的属性“canActivate”不能分配给基类型“CanActivate”中的相同属性?
- python - 如何制作一个数据透视表,其中列的值将作为几天的平均值获得?
- oracle - 何时在 Oracle 数据库中从 varchar2 转换为 clob?
- c# - 需要有关如何使用 C# 将 XML 文件转换为 CSV 的帮助
- jquery - 如何使用 Ajax jQuery 过滤 json 响应
- firebase - 我查询集合“.where”并获取文档 ID,我想删除它