我试图找到所有可能的值,这些值是给定数组值之和的结果。例如,如果给定数组是a=[50,100,120,260,360]
,那么结果将是[0,50,100,120,150,170,200,220,240,250,260,......]
。如何实现它?
我找到了一篇与之相关的文章,但这篇文章即将找到无法使用给定数组形成的值。
查找不能由给定数组的值形成的最小数
我发现还有一个讨论与此相关,但都是关于数学的,我仍然无法理解如何实现它。你可以看一看,找到所有可能的值,这些值可以使用一些值形成
C#中的任何算法或任何代码都可以提供帮助。
编辑
我们可以多次使用单个值。
更多结果可能是270(50*1100*1120)、300(100*3)、310(50*1260*1)等。
var repeat = 8;
int[] source = new int[] {
50, 100, 120, 260, 360
};
List < int > results = new List < int > ();
for (int i = 0; i < Math.Pow(repeat, source.Length); i++) {
var sum = 0;
var bin = Convert.ToString(i, repeat);
for (var j = 0; j < bin.Length; j++) {
var pos = int.Parse(bin[j].ToString());
if (0 < pos) {
sum += source[j] * pos;
}
}
results.Add(sum);
}
Console.WriteLine(results.Union(source).Distinct().OrderBy(x = > x));
使用类似这样的方法找到数组的所有子集,然后求和,如果不需要重复的值,则可以得到所有可能的值。
int[] source = new int[] { 50,100,120,260,360 };
for (int i = 0; i < Math.Pow(2, source.Length); i++)
{
int[] combination = new int[source.Length];
for (int j = 0; j < source.Length; j++)
{
if ((i & (1 << (source.Length - j - 1))) != 0)
{
combination[j] = source[j];
}
}
Console.WriteLine("[{0}, {1}, {2}]", combination[0], combination[1], combination[2]);
}
这是我使用的:
Func<IEnumerable<int>, IEnumerable<IEnumerable<int>>> getAllSubsets = null;
getAllSubsets = xs =>
(xs == null || !xs.Any())
? Enumerable.Empty<IEnumerable<int>>()
: xs.Skip(1).Any()
? getAllSubsets(xs.Skip(1))
.SelectMany(ys => new[] { ys, xs.Take(1).Concat(ys) })
: new[] { Enumerable.Empty<int>(), xs.Take(1) };
然后你可以这样做:
var a = new [] { 50, 100, 120, 260, 360 };
Console.WriteLine(String.Join(", ", getAllSubsets(a).Select(x => x.Sum()).OrderBy(x => x)));
我得到这个:
0, 50, 100, 120, 150, 170, 220, 260, 270, 310, 360, 360, 380, 410, 410, 430, 460, 480, 480, 510, 530, 530, 580, 620, 630, 670, 720, 740, 770, 790, 840, 890
知道价值观可以重复,那么这就是一条路:
public IEnumerable<int> GenerateAllSums(int[] array)
{
var buffer = new LinkedList<int>();
buffer.AddFirst(0);
while (true)
{
var first = buffer.First;
var nexts = array.Select(a => first.Value + a);
foreach (var next in nexts)
{
var x = buffer.First;
while (x.Value < next)
{
x = x.Next;
if (x == null)
{
break;
}
}
if (x == null)
{
buffer.AddLast(next);
}
else if (x.Value != next)
{
buffer.AddBefore(x, next);
}
}
buffer.RemoveFirst();
yield return first.Value;
}
}
我可以这样称呼它:
var a = new [] { 50, 100, 120, 260, 360, };
Console.WriteLine(String.Join(", ", GenerateAllSums(a).Take(100)));
重要的是要注意。采取(...)
现在至关重要,因为序列是无限的。
给定。取(100)
我得到这个结果:
0, 50, 100, 120, 150, 170, 200, 220, 240, 250, 260, 270, 290, 300, 310, 320, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710, 720, 730, 740, 750, 760, 770, 780, 790, 800, 810, 820, 830, 840, 850, 860, 870, 880, 890, 900, 910, 920, 930, 940, 950, 960, 970, 980, 990, 1000, 1010, 1020, 1030, 1040, 1050, 1060, 1070, 1080, 1090, 1100, 1110, 1120, 1130, 1140, 1150, 1160, 1170
我在学校的任务是创建一个程序,以升序排列数组的值。它几乎就在那里,但每当我输入“44 55 66 22 33 11 77 99 88 66”或它输出的任何数字 -858993460,11,22,33,44,55,66,66,77,88,或开头为负数 第一个数字到底怎么了?我是不是缺了什么? 我对C++很陌生,我不太明白这里的问题。如果有什么建议我可以用请告诉他们。 }
stackoverflow社区, 给定数字的数字可以交换。在一个序列中,同一个数字只能使用一次(例如20和02、15和51,它们只能在一个序列中使用一次)好吧,我尝试了几个代码组合,但没有一个成功。。。
我正在尝试编写一个程序,它将多个数字和一个基数作为参数,并通过非零数字升序的数字向上计数。例如,在具有3位数字的基数4中,它应该打印: 000 001 002 003 010 011 012 013 020 022 023 030 033 100 101 102 103 110 111 112 113 120 122 123 130 133 200 202 203 220 222 223 230
有人能提供帮助,如何检查排序降序数组以及?干杯!
本文向大家介绍在JavaScript的排序数组中查找所需的数字,包括了在JavaScript的排序数组中查找所需的数字的使用技巧和注意事项,需要的朋友参考一下 我们有一个整数数组,该数组按升序排序。我们需要编写一个JavaScript函数,该函数将一个数组作为第一个参数,并将目标和数作为第二个参数。 该函数应该从数组中查找并返回两个这样的数字,当它们相加时将给出目标和。解决此问题的条件是我们必须在
问题内容: 我接受了采访,并且有以下问题: 在不到O(n)的时间内从排序数组中查找唯一数字。 我给出了解决方案,但这是O(n)的。 编辑: 排序后的数组大小约为200亿,唯一数约为1000。 问题答案: 分而治之 : 查看排序序列的第一个和最后一个元素(初始序列为)。 如果两者相等,则序列中的唯一元素是第一个(无论序列有多长)。 如果不同,则划分序列并为每个子序列重复。 一般情况下解决 O(log