【问题标题】:Constructing Logic构建逻辑
【发布时间】:2017-01-31 12:17:06
【问题描述】:

您好,我正在练习一些编码(黑客等级挑战),但我在构建基本逻辑方面失败了,我觉得好像我看得太简单了。 我的程序的目的是给定一个 6 x 6 的数组作为输入,我计算每个沙漏总和并仅显示最大总和。 数组的输入范围从 -9 到 9(含)。 所以如果我的输入数组是

7 8 9 1 2 3

5 6 7 3 4 2

7 9 5 1 3 5

7 9 5 2 1 1

9 5 3 1 3 3

7 6 1 3 5 8

它应该显示所有计算出的沙漏的最大总和。沙漏的一个例子是

7 8 9

...6

7 9 5

这也恰好是这个特定数组中的最高和 (51)。 我面临的问题是当我的所有输入都是负数时显示最大总和。

-1 -1 0 -9 -2 -2

-2 -1 -6 -8 -2 -5

-1 -1 -1 -2 -3 -4

-1 -9 -2 -4 -4 -5

-7 -3 -3 -2 -9 -9

-1 -3 -1 -2 -4 -5

这是我未能通过测试用例的数组。所以在我的代码中,当我声明我的变量 current sum 和 max sum 时,我将它们都初始化为零。在计算每个总和后,我检查我的当前总和是否大于我的最大总和,但是,在所有负整数的情况下,当我的当前总和已经小于最大总和时,它永远不会进入那个 if 语句,我如果我当前的总和已经小于零,我看不出我应该提供什么对应条件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Globalization;

namespace C_hash_Tutorials
{
    class HackerRank_Day11
    {
        static void Main(string[] args)
        {
            int[][] arr = new int[6][];
            string[] arr_temp;
            int arr_i = 0;
            int curr_sum = 0;
            int max_sum = 0;
            for (arr_i = 0; arr_i < 6; arr_i++)
            {
                arr_temp = Console.ReadLine().Split(' ');
                arr[arr_i] = Array.ConvertAll(arr_temp, Int32.Parse);
            }

            for (int x = 0; x < arr.Length-2; x++)
            {
                for (int y = 0; y < arr.Length-2; y++)
                {
                    curr_sum = arr[x][y] + arr[x][y + 1] + arr[x][y + 2] + arr[x + 1][y + 1] + arr[x + 2][y] + arr[x + 2][y + 1] + arr[x + 2][y + 2];
                    Console.WriteLine(curr_sum);
                    if (curr_sum > max_sum)
                    {
                        max_sum = curr_sum;
                    }
                }
            }

            Console.WriteLine(max_sum);
            Console.ReadLine();
        }
    }
}

【问题讨论】:

  • 可能的最小值是七个 -9 的总和,因此将变量初始化为 -64,它应该可以工作。
  • 是的,这行得通。谢谢。在我将最大总和初始化为 -100 作为安全预防措施之前,但在这样做时,我觉得我好像在欺骗条件语句的逻辑。谢谢。这更符合逻辑。

标签: c# logic


【解决方案1】:

我相信您所要做的就是将max_sum 初始化为最小值:

int curr_sum = 0;
int max_sum = int.MinValue;
...

【讨论】:

  • 是的,我可以这样做,而且效果很好。我之前将它初始化为 -100,但我觉得在计算总和时好像在逻辑上作弊,所以我带你们看看我在构造条件语句时是否看得太简单了。
【解决方案2】:

当解决此类问题(总结某种沙漏)时,最初的意图是生成这些沙漏作为一个独立的例程

private static IEnumerable<T[]> HourGlasses<T>(T[][] source) {
  if (null == source)
    yield break;

  for (int r = 0; r < source.Length - 2; ++r) {
    T[] top = source[r];
    T[] middle = source[r + 1];
    T[] bottom = source[r + 2];

    int n = Math.Min(Math.Min(top.Length - 2, bottom.Length - 2), middle.Length - 1);

    for (int i = 0; i < n; ++i)
      yield return new T[] {
        top[i],    top[i + 1],    top[i + 2],
                   middle[i + 1],
        bottom[i], bottom[i + 1], bottom[i + 2], };
  }
}

提取了这个方法,您可以轻松回答您的问题:

int[][] arr = ...

...
int max = HourGlasses(arr)               // extract each hour glass
  .Select(hourGlass => hourGlass.Sum())  // sum up items within each hour glass
  .Max();                                // return the max of these sums

请注意,现在您可以轻松找出 MinArgMax(哪个沙漏的总和最大)等。

【讨论】:

  • 我会查看这个并使用代码以便我更好地理解它。谢谢你的另一个详细的回答。
猜你喜欢
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多