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

Posted

技术标签:

【中文标题】你知道如何在不改变其他元素顺序的情况下将元素移动到第一个位置吗?【英文标题】:Do you know how to move elements to first position, without changing other elements order? 【发布时间】:2021-05-05 12:50:28 【问题描述】:

 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

【问题讨论】:

为什么不使用List&lt;int&gt;而不是数组?还是在您的作业中使用数组? 这就是我的练习方式..不幸的是,它必须是一个数组.. 移动第一个是不够的,你必须移动所有项目。从最后一个索引开始,将每个元素再推一个位置,直到到达插入项的索引。 使用这样的代码,设置单元测试可能很有用。 IE。创建一个小数组,用一些不同的数据调用各个小函数并检查结果。它符合您的期望吗?你能阅读并理解为什么测试的代码没有按预期工作吗?如果没有,你能测试一个更小的部分吗?如果一切都失败了,请学习如何使用调试器并逐步执行代码,这样您就可以在每个单独的语句之后检查程序状态。 【参考方案1】:

这是工作示例,使用 LinkedList&lt;int&gt;

输入: 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;

【讨论】:

以上是关于你知道如何在不改变其他元素顺序的情况下将元素移动到第一个位置吗?的主要内容,如果未能解决你的问题,请参考以下文章

在不知道元素类型的情况下将项添加到列表中

如何在不更改其参考的情况下将更改应用于张量/向量的元素?

如何在不跟踪索引的情况下将元素附加到列表?

如何在不复制 C# 的情况下将结构数组元素提取到变量中?

如何在不跟踪索引的情况下将元素附加到列表中?

如何在不添加我自己的 prop 的情况下将内置的 Vuetify 组件 prop 从其父级应用到 SFC 的根元素?