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上,但是要更改参数名称,这样每个人都会看到它的功能和可维护性。看看