根据给定输入顺序打印变量的最佳方式,例如 C# 中的 ABC 或 CAB

Best way to print variables depending on a given input order, like ABC or CAB in C#

我正在尝试学习 C#,所以我正在 open.kattis.com 上做作业。 我有三个名为 A、B 和 C 的变量,必须按给定顺序打印它们。 A是最小变量,B是中间变量,C是最大变量。

我给变量1,2,5和顺序ABC,所以输出print是1 2 5 我给变量 1、10、22 和顺序 CAB,所以输出是 22 1 10

然而,我的问题是改进我的代码。现在我正在检查 switch-case 中的输入顺序,想知道是否有更好的方法。

我的提交可以在这里看到:

using System;
using System.Linq;

class Program
{
    public static void Main(string[] args)
    {
        string[] input = Console.ReadLine().Split(' ');
        string order = Console.ReadLine();
        int[] inputArray = {0, 0, 0};
        int A = 0, B = 0, C = 0;

        for (int i = 0; i < input.Length; i++)
        {
            inputArray[i] = Int32.Parse(input[i]);
        }
        A = inputArray.Min();
        C = inputArray.Max();
        for (int i = 0; i < inputArray.Length; i++)
        {
            if (inputArray[i] != A && inputArray[i] != C)
            {
                B = inputArray[i];
            }
        }

        switch (order)
        {
            case "ABC":
                Console.WriteLine($"{A} {B} {C}");
                break;
            case "ACB":
                Console.WriteLine($"{A} {C} {B}");
                break;
            case "BAC":
                Console.WriteLine($"{B} {A} {C}");
                break;
            case "BCA":
                Console.WriteLine($"{B} {C} {A}");
                break;
            case "CBA":
                Console.WriteLine($"{C} {B} {A}");
                break;
            case "CAB":
                Console.WriteLine($"{C} {A} {B}");
                break;
        }
        
    }
}

让我们概括解决方案。所以你有数据数组:

int[] inputArray = new int[] {1, 2, 3}

order:

string order = "BAC"; 

现在我们可以order上循环并输出对应的数组项:

for (char letter in order)
  Console.Write($"{inputArray[letter - 'A']} ");

这里我们将letters从order(B,A,C)转换成索引(1,0, 2)

请注意,如果我们有相应的 order

,我们可以很好地使用 2 或 4 个项目的数组

代码:

public static void Main(string[] args) {
  string[] input = Console
    .ReadLine()
    .Split(' ', StringSplitOptions.RemoveEmptyEntries);

  int[] inputArray = new int[input.Length];

  for (int i = 0; i < input.Length; ++i)
    inputArray[i] = int.Parse(input[i]);

  Array.Sort(inputArray);

  string order = Console.ReadLine();

  for (char letter in order)
    Console.Write($"{inputArray[letter - 'A']} ");
}

您的应用:

class Program
{
    public static void Main(string[] args)
    {
        var input = Console.ReadLine().Split(' ').Select(int.Parse).OrderBy(x=> x).ToArray();
        var order = Console.ReadLine().Select(x=> x-'A');

        var output = string.Join(" ", order.Select(x => input[x]));
        Console.WriteLine(output);
    }
}

为自定义输入数量工作。

一个答案非常高级,另一个答案对于任何未排序的输入都失败了,所以这是我的帮助。

对于任意数量的输入,您可以归纳出任务的两个重要部分:

  • 获取最小值、最大值、中间值(或大于 3 项的最小值、...、最大值):这可以通过对集合进行排序来完成。
  • 将以字母表示的顺序转换为现在已排序数组中元素的索引。

最小值、中间值、最大值

var a = new[] {22, 10, 1};
Array.Sort(a);

var min = a[0];
var middle = a[1];
var max = a[2];

Console.WriteLine($"{min}, {middle}, {max}");

这会打印

1, 10, 21

从 CAB 到 2,0,1(索引)

C# 中的字符(~字母)具有数字值,我们可以利用它。

char c1 = 'A';
char c2 = 'B';

Console.WriteLine((byte)c1);
Console.WriteLine((byte)c2);
Console.WriteLine(c1 - 'A');
Console.WriteLine(c2 - 'A');

这会打印

65
66
0
1

了解这一点让我们尝试翻译“CAB”:

string order = "CAB";

foreach(char c in order)
{
    int index = c - 'A';
    Console.WriteLine($"Character '{c}' is index: {index}");
}

这会打印:

Character 'C' is index: 2
Character 'A' is index: 0
Character 'B' is index: 1

解决方案

有了这两个转换,您应该能够概括您的解决方案。