首页 > 解决方案 > 你知道如何在不改变其他元素顺序的情况下将元素移动到第一个位置吗?

问题描述


 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

标签: c#arraysmethodsnumbersmove

解决方案


这是工作示例,使用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;
}

推荐阅读