C# 在每行算法中找到最高分数

C# 在每行算法中找到最高分数,c#,algorithm,C#,Algorithm,为了训练我的编码foo,我决定在CodeEval平台上注册。我偶然发现了一个我认为很简单的练习,但由于某种原因,有一个我很久以前就无法解决的bug。 情况是这样的(我只列出了文本中似乎更重要的内容): “参与者计算了每幅作品的得票数,并将其插入表格。但是,他们无法确定哪一个运动获胜,谁的作品得分最高,所以他们请你帮忙。 您需要确定并打印表格中每个类别的最高分数。” 有关练习的更多信息,请访问以下链接: 这是平台用于验证我的算法是否正常的示例输入: 333 967 860 -742 -279 -

为了训练我的编码foo,我决定在CodeEval平台上注册。我偶然发现了一个我认为很简单的练习,但由于某种原因,有一个我很久以前就无法解决的bug。 情况是这样的(我只列出了文本中似乎更重要的内容):

“参与者计算了每幅作品的得票数,并将其插入表格。但是,他们无法确定哪一个运动获胜,谁的作品得分最高,所以他们请你帮忙。 您需要确定并打印表格中每个类别的最高分数。” 有关练习的更多信息,请访问以下链接:

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

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);
    });