C# 从三角形的每一行中求出最大的数并求和

C# 从三角形的每一行中求出最大的数并求和,c#,C#,下面是三角形数字,将作为参数发送到函数 5 9 6 4 6 8 0 7 1 5 现在,这将在下面的函数中作为字符串接收,格式为5#9#6#4#6#8#0#7#1#5。到目前为止,我只尝试了# 如何从每一行中找出最大的数字并求和,如何识别要求和的行?希望能找到一些帮助。总结每行中的所有值: private static IEnumerable<int> Sum(string input) { int i = 0, s = 0, z = 1; foreach (var

下面是三角形数字,将作为参数发送到
函数

5
9 6
4 6 8
0 7 1 5
现在,这将在下面的函数中作为字符串接收,格式为
5#9#6#4#6#8#0#7#1#5
。到目前为止,我只尝试了
#


如何从每一行中找出最大的数字并求和,如何识别要求和的行?希望能找到一些帮助。

总结每行中的所有值:

private static IEnumerable<int> Sum(string input)
{
    int i = 0, s = 0, z = 1;
    foreach (var v in input.Split('#').Select(int.Parse))
    {
        s += v;
        if (++i != z) continue;
        z++;
        yield return s;
        s = i = 0;
    }
}
private static int Sum(string input)
{
    int i = 0, s = 0, z = 1, m = 0;
    foreach (var v in input.Split('#').Select(int.Parse))
    {
        if (v > m) m = v;
        if (++i != z) continue;
        z++;
        s += m;
        i = m = 0;
    }
    return s;
}
同一行:

private static IEnumerable<int> Sum(string input) => new Func<int, int, IEnumerable<int>>((i, z) => input.Split('#').Select(int.Parse).GroupBy(e => i++ == z && (i = 1) != null ? ++z : z, e => e).Select(e => e.Sum()))(0, 1);
private static int Sum(string input) => new Func<int, int, int>((i, z) => input.Split('#').Select(int.Parse).GroupBy(e => i++ == z && (i = 1) != null ? ++z : z, e => e).Select(e => e.Max()).Sum())(0, 1);
private static int-Sum(string-input)=>new Func((i,z)=>input.Split('#').Select(int.Parse).GroupBy(e=>i++==z&(i=1)!=null?++z:z,e=>e.Max().Sum())(0,1);

我以
IEnumerable
的形式返回总和,并以
的形式返回收益
。如果您只想打印答案,请将返回类型更改为
void
,并删除
yield returns行。

我将使用两个函数:

第一个将字符串转换为树表示形式的方法:

  List<List<int>> GetTree(string data)
    {
        List<List<int>> CompleteTree = new List<List<int>>();
        List<int> ValuesInLine = new List<int>();

        int partsinrow = 1;
        int counter = 0;

        foreach (string part in data.Split('#'))
        {
            int value = int.Parse(part);
            ValuesInLine.Add(value);

            if (++counter == partsinrow)
            {
                CompleteTree.Add(ValuesInLine);
                ValuesInLine = new List<int>();
                counter = 0;
                partsinrow++;
            }
        }

        return CompleteTree;
    }
List GetTree(字符串数据)
{
List CompleteTree=新列表();
列表值行=新列表();
int partsinrow=1;
int计数器=0;
foreach(data.Split('#')中的字符串部分)
{
int value=int.Parse(部分);
行中的值。添加(值);
如果(++计数器==零件行)
{
完成树。添加(行中的值);
ValuesInLine=新列表();
计数器=0;
partsinrow++;
}
}
返回完整树;
}
第二个用于汇总最大行数:

    int GetSumOfTree(List<List<int>> tree)
    {
        int sum = 0;

        foreach (List<int> line in tree)
        {
            line.Sort();
            int max = line[line.Count - 1];
            sum += max;
        }

        return sum;
    }
intgetsumoftree(列表树)
{
整数和=0;
foreach(树中的列表行)
{
line.Sort();
int max=line[line.Count-1];
总和+=最大值;
}
回报金额;
}

请相信Widi:),但这是您的要求

var rows = Sum("5#9#6#4#6#8#0#7#1#5");
var total = rows.Sum();

private static IEnumerable<int> Sum(string inp)
{
    int i = 0, s = 0, z = 1;
    foreach (var v in inp.Split('#').Select(int.Parse))
    {
        s = Math.Max(s, v);
        if (++i == z)
        {
            z++;
            yield return s;
            s = i = 0;
        }
    }
}
var rows=Sum(“5#9#6#4#6#8#0#7#5”);
var total=rows.Sum();
私有静态IEnumerable和(字符串inp)
{
int i=0,s=0,z=1;
foreach(inp.Split('#')中的变量v。选择(int.Parse))
{
s=数学最大值(s,v);
如果(++i==z)
{
z++;
收益率;
s=i=0;
}
}
}
您可以使用LINQ:

string input = "5#9#6#4#6#8#0#7#1#5";
var nums = input.Split('#').Select(s => Int32.Parse(s));

var res = Enumerable.Range(0, nums.Count())
                    .Select(n => nums.Skip(Enumerable.Range(0, n).Sum()).Take(n));
                    .Where(x => x.Any());  // here you have IEnumerable<int> for every row 
                    .Select(arr => arr.Max());
string input=“5#9#6#4#6#8#0#7#1#5”;
var nums=input.Split('#')。选择(s=>Int32.Parse);
var res=Enumerable.Range(0,nums.Count())
.Select(n=>nums.Skip(Enumerable.Range(0,n).Sum()).Take(n));
.其中(x=>x.Any());//这是每一行的IEnumerable
.选择(arr=>arr.Max());

解决这个问题的一种方法是确定三角形的大小。我所说的尺寸是指高度/宽度。例如,提供的三角形大小为4

如果大小为
n
,则三角形中的元素数将为
n(n+1)/2
。当输入中的元素数量已知时,可通过求解二次多项式并选取正解(以下表达式涉及平方根)来求解以确定
n
(大小):

因此,使用提供的输入
size
将是
4
。然后,可以使用大小选择三角形中的每一行,并执行所需的算术运算:

var maxValues = Enumerable
  .Range(0, size)
  .Select(i => new { Start = i*(i + 1)/2, Count = i + 1 })
  .Select(x => values.Skip(x.Start).Take(x.Count))
  .Select(v => v.Max());
第一个
Select
将计算必要的索引,以便正确地切片在第二个
Select
中完成的值数组。再次使用公式
n(n+1)/2
。如果你想,你可以合并一些
Select
操作,但我认为把它们分开可以让事情变得更清楚

这将输出数字
5、9、8、7
。如果你想把这些加起来,你可以这样做:

return maxValues.Sum();
public static IEnumerable<IEnumerable<int>> MakeTriangular(int[] numbers)
{
    for (int i = 0, len = 1; i < numbers.Length; i += len, ++len)
        yield return new ArraySegment<int>(numbers, i, len);
}

让我们将其分解如下:

int sum = MakeTriangular(numbers).Sum(row => row.Max());
首先,将输入转换为数字数组:

string input = "5#9#6#4#6#8#0#7#1#5";
var numbers = input.Split('#').Select(int.Parse).ToArray();
现在让我们假设我们有一个
maketriangal(int[])
方法,该方法将一个数字数组转换为一个行序列,第一行的长度为1,第二行的长度为2,依此类推,因此它返回
IEnumerable

然后我们可以将其与Linq一起用于计算每行中最大值的总和,如下所示:

int sum = MakeTriangular(numbers).Sum(row => row.Max());
这就给出了答案

makeTriangal()
的实现可能如下所示:

return maxValues.Sum();
public static IEnumerable<IEnumerable<int>> MakeTriangular(int[] numbers)
{
    for (int i = 0, len = 1; i < numbers.Length; i += len, ++len)
        yield return new ArraySegment<int>(numbers, i, len);
}
公共静态IEnumerable(int[]数字)
{
对于(int i=0,len=1;i
将所有内容整合到一个可编译的控制台应用程序中:

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

namespace Demo
{
    class Program
    {
        public static void Main()
        {
            string input = "5#9#6#4#6#8#0#7#1#5";
            var numbers = input.Split('#').Select(int.Parse).ToArray();
            int sum = MakeTriangular(numbers).Sum(row => row.Max());
            Console.WriteLine(sum);
        }

        public static IEnumerable<IEnumerable<int>> MakeTriangular(int[] numbers)
        {
            for (int i = 0, len = 1; i < numbers.Length; i += len, ++len)
                yield return new ArraySegment<int>(numbers, i, len);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
名称空间演示
{
班级计划
{
公共静态void Main()
{
字符串输入=“5#9#6#4#6#8#0#7#1#5”;
var numbers=input.Split(“#”).Select(int.Parse.ToArray();
int sum=maketriangal(数字).sum(行=>row.Max());
控制台写入线(总和);
}
公共静态IEnumerable(int[]数字)
{
对于(int i=0,len=1;i
但您认为您的程序如何计算每行上存在多少个数字?它总是以
1
开始并递增吗?@SonerGönül每行肯定只包含一个额外的数字,到目前为止,我只需要以上4行的输出..1)您知道第一行的长度为1,第二行的长度为2,等等。这就是您可以识别它们的方式。2) 您不能对
string
s求和,因此需要将它们转换为
int
s。您的输入是固定的,还是您选择了此项?第二部分已清除。。但是仍然停留在第一部分@Dennis_Egood one上,但是要更改参数名称,这样每个人都会看到它的功能和可维护性。看看