返回逗号分隔的前两个数组元素的字符串,最多可添加30个

时间:2014-11-18 04:56:30

标签: c# arrays sum

我是一名新的C#程序员,目前我遇到了以下问题:

Given an array of numbers = 
   [49, 71, 68, 26, 58, 64, 47, 16, 42, 53, 20, 15, 17, 45, 43, 52, 88, 65, 46, 82, 86, 
    69, 84, 56, 54, 28, 60, 32, 95, 29, 9, 79, 98, 51, 90, 36, 24, 62, 14, 91, 83, 3, 
    74, 30, 33, 6, 92, 40, 70, 2, 44, 31, 55, 12, 8, 89, 37, 72, 25, 81, 23, 100, 13, 
    87, 80, 18, 85, 5, 78, 10, 75, 41, 67, 94, 27, 96, 22, 73, 21, 63, 7, 34, 39, 61, 
    4, 19, 97, 93, 11, 35, 77, 76, 48, 57, 50, 99, 1, 59, 66, 38]

编写一个C#函数,它将返回数组中前两个数字的逗号分隔字符串,总和为30并立即退出。

我已经在这方面工作了一段时间,看起来很简单,但这是我能够提出的所有内容:

 using System;
    using System.Collections.Generic;
    using System.Linq;

    class Program
    {
       static void Main()
       {
           int[] array1 = { 49, 71, 68, 26, 58, 64, 47, 16, 42, 53, 20, 15, 17, 45, 43, 52, 88, 65, 46, 82, 86, 69, 84, 56, 54, 28, 60, 32, 95, 29, 9, 79, 98, 51, 90, 36, 24, 62, 14, 91, 83, 3, 74, 30, 33, 6, 92, 40, 70, 2, 44, 31, 55, 12, 8, 89, 37, 72, 25, 81, 23, 100, 13, 87, 80, 18, 85, 5, 78, 10, 75, 41, 67, 94, 27, 96, 22, 73, 21, 63, 7, 34, 39, 61, 4, 19, 97, 93, 11, 35, 77, 76, 48, 57, 50, 99, 1, 59, 66, 38 };
           int sum1 = array1.Sum();
           Console.WriteLine(sum1);
        }
    }

我知道我只是遗漏了一些小东西而且我发现了类似的问题,但没有人为我解决过这个问题。任何帮助或推动正确的方向将不胜感激。

3 个答案:

答案 0 :(得分:1)

功能:

static string GetFirstPairOf30(int[] data) {
    for (int i = 0; i < data.Length; i++) {
        for (int j = 0; j < data.Length; j++) {
            if (i != j && data[i] + data[j] == 30) {
                return String.Format("{0},{1}", data[i], data[j]);
            }
        }
    }
    throw new ArgumentException("Array does not contain pairs with sum 30");
}

用法:

   Console.WriteLine(GetFirstPairOf30(array1));

答案 1 :(得分:0)

我建议在这里做的是首先在数组中编写循环,但要确保它不包含最后一项。原因是您将比较每个元素和它旁边的元素,因此如果您尝试在结束后到达一个元素,则会出现异常:

for(int i = 0; i < myArray.Length - 1; i++)

在其中,您将需要一个从该索引之后循环的for循环,直到数组结束。例如,如果从索引0开始,则要检查索引1-end是否可以添加到30的另一个数字:

for(int i = 0; i < myArray.Length - 1; i++)
{
   for(int j = i + 1; j < myArray.Length; j++)
   {
   }
}

在其中,您可以编写条件语句以查看它们是否添加到30:

for(int i = 0; i < myArray.Length - 1; i++)
{
   for(int j = i + 1; j < myArray.Length; j++)
   {
      if(myArray[i] + myArray[j] == 30)
      {
         return (String.Format("{0},{1}", myArray[i], myArray[j]));
      }
   }
}

如果你通过这些循环而没有返回,你可以打印出没有总和为30的值。


我认为可能会让这个更快一点的是添加一个检查,如果每个外部元素都大于30.如果是,没有什么会给你一笔30(假设你不允许负面) ),所以不要浪费时间做不必要的循环。例如:如果您的数组是100个整数,并且位置0的值为32,那么您将无需循环遍历其他99个整数。所以,你可以试试这个:

for(int i = 0; i < myArray.Length - 1; i++)
{
   if(myArray[i] > 30)
   {
      continue;
   }

   for(int j = i + 1; j < myArray.Length; j++)
   {
      if(myArray[i] + myArray[j] == 30)
      {
         return (String.Format("{0},{1}", myArray[i], myArray[j]));
      }
   }
}

修改

为了澄清这在实际项目中的表现,请考虑以下事项:

public static void main(String[] args)
{
   int[] myArray = // All your stuff here;
   Console.WriteLine(GetElementsWithSum30(myArray));
}

public static String GetElementsWithSum40(myArray)
{
   for(int i = 0; i < myArray.Length - 1; i++)
   {
      if(myArray[i] > 30)
      {
         continue;
      }

      for(int j = i + 1; j < myArray.Length; j++)
      {
         if(myArray[i] + myArray[j] == 30)
         {
            return (String.Format("{0},{1}", myArray[i], myArray[j]));
         }
      }
   }
   // If we finished looping and didn't find anything, return that.
   return("No elements found that sum 30.");
}

答案 2 :(得分:-1)

您可以编写如下的扩展方法,并在需要的地方使用

public static class Extensions{
    public static string Sum30(this int[] array)
    {
        var res = (from a in array
                    from b in array
                    where a + b == 30
                    select new
                    {
                        element = a.ToString() + "," + b.ToString()
                    }).FirstOrDefault(t => t != null);

        return res == null ? string.Empty : res.element;
    }
}
then use it like this
        var arr = new int[] { 86, 12, 39, 14, 90, 0, 16, 19,18, 17 };
        var returnvalue = arr.Sum30();