我是一名新的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);
}
}
我知道我只是遗漏了一些小东西而且我发现了类似的问题,但没有人为我解决过这个问题。任何帮助或推动正确的方向将不胜感激。
答案 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();