查找每行算法中的最高分数

时间:2015-08-12 12:55:08

标签: c# algorithm

为了训练我的编码foo,我决定在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);
                }
        }
    }

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

2 个答案:

答案 0 :(得分:1)

总的来说,这就是我要处理这个问题的方法:

首先使用Split("|")将字符串拆分为行(让我们调用生成的数组rows)。现在创建一个名为List<int>的{​​{1}}。现在循环遍历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; } 应包含每列的所有最大值(即类别)。

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

columnMax

答案 1 :(得分:1)

我打算发布整个解决方案,但我认为这是一场你参与的比赛。

所以这是我的帮助:

尝试将问题分解为小问题并一次解决一件事。实际上你的代码有点混乱。

首先创建一个方法来加载所有文件条目,并返回一个字符串集合,其中包含文件中每行的人员分数。这需要更多的方法来将string []转换为int [],就像这一样。

self.routes['/portfolio'] = function(req, res) {
      // Website you wish to allow to connect
         res.jsonp({ "my": "object" });
};

然后,对于每个int集合,调用一个方法,该方法能够将每个类别得分分组到不同的int数组中,并且您可以返回每个类别得分的最大数量。