C# 在每行算法中找到最高分数
为了训练我的编码foo,我决定在CodeEval平台上注册。我偶然发现了一个我认为很简单的练习,但由于某种原因,有一个我很久以前就无法解决的bug。 情况是这样的(我只列出了文本中似乎更重要的内容): “参与者计算了每幅作品的得票数,并将其插入表格。但是,他们无法确定哪一个运动获胜,谁的作品得分最高,所以他们请你帮忙。 您需要确定并打印表格中每个类别的最高分数。” 有关练习的更多信息,请访问以下链接: 这是平台用于验证我的算法是否正常的示例输入:C# 在每行算法中找到最高分数,c#,algorithm,C#,Algorithm,为了训练我的编码foo,我决定在CodeEval平台上注册。我偶然发现了一个我认为很简单的练习,但由于某种原因,有一个我很久以前就无法解决的bug。 情况是这样的(我只列出了文本中似乎更重要的内容): “参与者计算了每幅作品的得票数,并将其插入表格。但是,他们无法确定哪一个运动获胜,谁的作品得分最高,所以他们请你帮忙。 您需要确定并打印表格中每个类别的最高分数。” 有关练习的更多信息,请访问以下链接: 这是平台用于验证我的算法是否正常的示例输入: 333 967 860 -742 -279 -
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);
}
}
}
//在测试用例中读取的示例代码:
使用System.IO;
使用System.Collections.Generic;
使用System.Linq;
使用制度;
班级计划
{
静态void Main(字符串[]参数)
{
使用(StreamReader=File.OpenText(args[0]))
而(!reader.EndOfStream)
{
字符串行=reader.ReadLine();
if(null==行)
继续;
列出最高分=新列表();
var temporaryNumbers=新列表();
string[]splittedLine=line.Split(“”);
foreach(拆分行中的变量s)
{
如果(s==“|”)
{
添加(temporaryNumbers.Max());
临时数字。清除();
继续;
}
int值;
if(int.TryParse(s,out值))
{
临时数字。添加(值);
继续;
}
继续;
}
如果(最高分.计数==0)
继续;
var newLine=highestScores.Aggregate(string.Empty,(current,value)=>current+(value+);
控制台输出写入线(换行);
}
}
}
我想我的问题是如何解决这种情况?不是从他们使用的输入中跳一行,而是每一行。在最后一行|处,代码跳到下一行(如果有) 大体上,我会这样处理: 首先使用
split(“|”)将字符串拆分为行(让我们调用结果数组rows
)。现在创建一个名为columnMax
的列表。现在循环遍历行
,对于每一行,我们将拆分(“”
(我们称之为单元格
)。现在我们知道(从原始分配中)我们可以假设行的长度都相同,因此我们将使用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;
}
我本打算发布整个解决方案,但正如我所看到的,这是一个你参与的竞赛
这就是我的帮助:
试着把你的问题分成几个小问题,一次解决一件事。实际上你的代码有点梅西
首先,创建一个方法来加载所有文件条目,并返回一个字符串集合,其中包含文件中每一行的人员分数。这将需要更多的方法将字符串[]转换为int[],如下面的方法
static void StringToIntegers()
{
var input=“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”;
var primaryArray=input.Split(“|”);
foreach(primaryArray中的var块)
{
var trimmedBlock=block.Trim();
var secondaryArray=trimmedBlock.Split(“”);
var intArray=StringArrToIntArr(二次数组);
}
}
私有静态int[]StringArrToIntArr(string[]secondaryArray)
{
int[]intArray=new int[secondaryArray.Length];
for(int i=0;i
然后,对于每个int集合调用,一个方法能够将每个类别分数分组到不同的int数组中,在那里您可以返回每个类别的最大值。您能再解释一下输入格式吗?|
是否应该标记一行的结尾?数字应该是列吗?对不起,是的,我应该解释一下。“表行由管道“|”分隔。所有表行都包含每个类别的分数,因此所有行的长度都相等。”刚发现我在寻找迭代的结尾,这样做,我就从来没有在最后一个表行调用max…我想你看错了问题。看起来您正试图在每一行中找到最高分数,当查看链接时,看起来您应该在每一列中找到最高分数。因此,对于您的示例数据,结果应该是(通过检查,我可能会搞砸):963967909630531,-239
您是对的,我已经更新了我的链接,以便更好地理解它!很抱歉让读者感到困惑。因此,如果我理解正确,您应该在“|”上拆分后创建第一个循环来遍历行。然后在行(1..N)上循环时,您可以查看每个行
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);
});