返回逗号分隔的前两个数组元素的字符串,加起来最多为 30
本文关键字:字符串 起来 数组元素 分隔 返回 两个 | 更新日期: 2023-09-27 18:30:47
我是一个新的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);
}
}
我知道我只是错过了一些小东西,我发现了类似的问题,但没有一个为我解决这个问题。任何帮助或朝着正确方向推动将不胜感激。
函数:
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));
我在这里建议做的是首先通过数组编写一个循环,但要确保它不包含最后一项。原因是您将比较每个元素及其旁边的元素,因此,如果您在结束之后尝试到达一个元素,您将有一个例外:
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.");
}
您可以按如下方式编写扩展方法,并在需要的地方使用它
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();