gpt4 book ai didi

c# - 在每行算法中找到最高分

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:57:29 24 4
gpt4 key购买 nike

为了训练我的编程能力,我决定在 CodeEval 平台上注册。我偶然发现了一个我认为很简单的练习,但由于某种原因,很久以前就有一个我无法解决的错误。情况是这样的(我只放了文本中看起来更重要的部分):

“参与者计算了他们为每幅画获得的票数,并将其填入表格中。但是,他们无法确定哪个运动获胜以及谁的作品获得了最高分,因此他们请您帮忙。您需要确定并打印表格中每个类别的最高分。”更多关于以下链接的练习: https://www.codeeval.com/open_challenges/208/

这是平台用来验证我的算法是否正常的示例输入:

333 967 860 -742 -279 -905 | 
-922 380 -127 630 38 -548 |
258 -522 157 -580 357 -502 |
963 486 909 -416 -936 -239 |
517 571 107 -676 531 -782 |
542 265 -171 251 -93 -638

这是我从这个示例中得到的输出:967 630 357 963 571

起初,我不明白哪里出了问题。但似乎在上次之后“|”,我的代码卡住并“跳转”到我正在阅读的文件的第二行。对于我正在做的事情,我的代码看起来还不错。

这里是示例代码:

//Sample code to read in test cases:
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System;
class Program
{
static void Main(string[] args)
{
using (StreamReader reader = File.OpenText(args[0]))
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
if (null == line)
continue;

List<int> highestScores = new List<int>();
var temporaryNumbers = new List<int>();
string[] splittedLine = line.Split(' ');
foreach (var s in splittedLine)
{
if (s == "|")
{
highestScores.Add(temporaryNumbers.Max());
temporaryNumbers.Clear();
continue;
}
int value;
if (int.TryParse(s, out value))
{
temporaryNumbers.Add(value);
continue;
}
continue;
}
if(highestScores.Count == 0)
continue;

var newLine = highestScores.Aggregate(string.Empty, (current, value)=> current + (value + " "));
Console.Out.WriteLine(newLine);
}
}
}

我想我的问题是如何解决这种情况?它不是从他们使用的输入跳转一行,而是每一行。在最后一个 |,代码跳转到下一行,如果有的话。

最佳答案

概括地说,这就是我处理这个问题的方式:

首先使用 Split("|") 将您的字符串拆分成行(我们称结果数组为 rows )。现在创建一个 List<int>称为 columnMax .现在循环 rows对于每一行,我们将 Split(" ") (我们称之为 cells )。现在我们知道(从最初的分配)我们可以假设行的长度都是相同的,所以我们将遍历 cells使用 for循环并检查:

var value = int.Parse(cells[i]);    // leaving out error checking for now
// but you could use TryParse to catch bad data
if (columnMax.Count <= i)
{
columnMax.Add(value);
}
else if (columnMax[i] < value)
{
columnMax[i] = value;
}

现在在你的循环结束时,columnMax应包含每列(即类别)的所有最大值。

只是为了好玩,这是一个 Linq 解决方案:

var maximums = input.Split(new [] {'|'}, StringSplitOptions.RemoveEmptyEntries)
.Aggregate((IEnumerable<int>)null,(m,r) =>
{
var cells = r.Split(new [] {' '}, StringSplitOptions.RemoveEmptyEntries).Select(c => int.Parse(c));
return m == null ? cells : cells.Zip(m, Math.Max);
});

关于c# - 在每行算法中找到最高分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31965878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com