根据给定输入顺序打印变量的最佳方式,例如 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']} ");
这里我们将letter
s从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
解决方案
有了这两个转换,您应该能够概括您的解决方案。
我正在尝试学习 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']} ");
这里我们将letter
s从order
(B
,A
,C
)转换成索引(1
,0
, 2
)
请注意,如果我们有相应的 order
代码:
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
解决方案
有了这两个转换,您应该能够概括您的解决方案。