【问题标题】:input 1 2 5 8 7 3 10 6 4 9, output 1 2 3 5 7 8 10 6 4 9输入 1 2 5 8 7 3 10 6 4 9,输出 1 2 3 5 7 8 10 6 4 9
【发布时间】:2021-05-30 05:58:42
【问题描述】:

我正在尝试对输入进行排序以输出我有一个命令“从 2 到 4 排序”来从数字中得到最终结果,如果我有人帮忙谢谢。

List<int> nums = Console.ReadLine().Split().Select(int.Parse).ToList();
string input = Console.ReadLine();

while (true)
{
    string[] line = input.Split(" ");
    if (line[0] == "end")
    {
        break;
    }

    if (line[0] == "reverse")
    {
        int reverseFrom = int.Parse(line[2]);
        int reverseCount = int.Parse(line[4]);
        nums.Reverse(reverseFrom, reverseCount);
    }

    if (line[0] == "sort")
    {
        int sortFrom = int.Parse(line[2]);
        int sortCount = int.Parse(line[4]);
        nums.Sort(sortFrom, sortCount);
    }

    input = Console.ReadLine();
}

Console.WriteLine(string.Join(", ", nums));

【问题讨论】:

  • 请给我们看代码!
  • int[] output = input.Take(2).Concat(input.Skip(2).Take(4).OrderBy(x => x)).Concat(input.Skip(6 )).ToArray();
  • 输入1 2 5 8 7 3 10 6 4 9,输出1 2 3 5 7 8 10 6 4 9

标签: c# sorting numbers


【解决方案1】:

你可以尝试如下实现:

  1. 枚举从0from 的所有项目
  2. 缓存from .. from + count - 1范围内的项目,对它们进行枚举排序
  3. 枚举从from + count开始的所有项目

类似这样的:

public static IEnumerable<T> SortFromTo<T>(IEnumerable<T> source, int from, int count, 
                                           IComparer<T> comparer) {
  if (null == source)
    throw new ArgumentNullException(nameof(source));

  if (count < 0)
    throw new ArgumentOutOfRangeException(nameof(count));

  comparer = null == comparer ? Comparer<T>.Default : comparer;

  if (null == comparer) 
    throw new ArgumentNullException(nameof(comparer), 
      $"Type {typeof(T).Name} doesn't have default comparer");     
   
  int index = -1;

  List<T> cached = new List<T>();

  foreach (T item in source) {
    index += 1;

    if (index < from || index > from + count)
      yield return item;  
    else {
      cached.Add(item);

      if (index == from + count - 1) {
        cached.Sort(comparer);

        foreach (T rec in cached)
          yield return rec;

        cached.Clear(); 
      } 
    }
  }  
}

让我们变得友善,并为可比较的类型提供一个版本:

public static IEnumerable<T> SortFromTo<T>(IEnumerable<T> source, int from, int count)
  where T : IComparable<T> => SortFromTo(source, from, count, null);

那么你就可以放

int[] data = new int[] {1, 2, 5, 8, 7, 3, 10, 6, 4, 9};

int[] result = SortFromTo(data, 2, 4).ToArray();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    • 2021-02-15
    • 1970-01-01
    • 2011-09-08
    • 2012-10-19
    • 2023-02-02
    • 1970-01-01
    相关资源
    最近更新 更多