Graeme_Grant
Обновление 3: Добавлено глаг.Сетевая версия
Вот еще один быстрый пример:
using System;
using System.Collections.Generic;
using System.Linq;
namespace LargestGroupSum
{
static class Program
{
static void Main(string[] args)
{
foreach (var test in new List<List<int>>()
{
new List<int>(),
new List<int>() { -1, -2, -5, -4, -5, -1, -2, -11 },
new List<int>() { 1, 2, 5, 4, 5, 1, 2, 11 },
new List<int>() { 1, 2, -5, 4, 5, -1, 2, -11 },
new List<int>() { 1, 2, 4, -20, 4, 2, 1, -15, 3, 2, 2 },
new List<int>() { 5, -5, 5, -10, 5, -5, 5 },
new List<int>() { 5, -5, 5, -5, 5 },
new List<int>() { 5, 5, -5, -6 },
new List<int>() { -1, -1, 1, -1, 2 }
})
{
var lg = test.LargestGroupSumList();
Console.WriteLine($"For [{string.Join(",", test)}], the largest group is [{string.Join(",", lg)}] with {(lg.Any() ? $"a sum of {lg.Sum()}" : "no value")}");
}
Console.WriteLine("\r\n-- Press any key to exit --");
Console.ReadKey();
}
}
public static class HelperExtensions
{
public static IList<int> LargestGroupSumList(this IList<int> list)
{
if (!list.Any(x => x >= 1))
return new List<int>();
else if (!list.Any(x => x < 1))
return list;
else
{
var groups = new List<List<int>>();
for (int i = 0; i < list.Count; i++)
for (int j = 0; j < list.Count - i; j++)
groups.Add(list.Skip(i).Take(j + 1).ToList());
return groups.OrderByDescending(X => X.Count).OrderByDescending(x => x.Sum()).First();
}
}
}
}
Imports System.Runtime.CompilerServices
Module Module1
Sub Main()
For Each test In New List(Of List(Of Integer))() From {
New List(Of Integer)(),
New List(Of Integer)() From {-1, -2, -5, -4, -5, -1, -2, -11},
New List(Of Integer)() From {1, 2, 5, 4, 5, 1, 2, 11},
New List(Of Integer)() From {1, 2, -5, 4, 5, -1, 2, -11},
New List(Of Integer)() From {1, 2, 4, -20, 4, 2, 1, -15, 3, 2, 2},
New List(Of Integer)() From {5, -5, 5, -10, 5, -5, 5},
New List(Of Integer)() From {5, -5, 5, -5, 5},
New List(Of Integer)() From {5, 5, -5, -6},
New List(Of Integer)() From {-1, -1, 1, -1, 2}}
Dim lg = test.LargestGroupSumList()
Console.WriteLine("For [{0}], the largest group is [{1}] with {2}", String.Join(",", test), String.Join(",", lg), If(lg.Any(), String.Format("a sum of {0}", lg.Sum()), "no value"))
Next
Console.WriteLine("{0}-- Press any key to exit --", vbCrLf)
Console.ReadKey()
End Sub
End Module
Public Module HelperExtensions
<Extension>
Public Function LargestGroupSumList(list As IList(Of Integer)) As IList(Of Integer)
If Not list.Any(Function(x) x >= 1) Then
Return New List(Of Integer)()
ElseIf Not list.Any(Function(x) x < 1) Then
Return list
Else
Dim groups = New List(Of List(Of Integer))()
For i As Integer = 0 To list.Count - 1
For j As Integer = 0 To list.Count - i - 1
groups.Add(list.Skip(i).Take(j + 1).ToList())
Next
Next
Return groups.OrderByDescending(Function(x) x.Count).OrderByDescending(Function(x) x.Sum()).First()
End If
End Function
End Module
Выходы:
For [], the largest group is [] with no value
For [-1,-2,-5,-4,-5,-1,-2,-11], the largest group is [] with no value
For [1,2,5,4,5,1,2,11], the largest group is [1,2,5,4,5,1,2,11] with a sum of 31
For [1,2,-5,4,5,-1,2,-11], the largest group is [4,5,-1,2] with a sum of 10
For [1,2,4,-20,4,2,1,-15,3,2,2], the largest group is [1,2,4] with a sum of 7
For [5,-5,5,-10,5,-5,5], the largest group is [5,-5,5] with a sum of 5
For [5,-5,5,-5,5], the largest group is [5,-5,5,-5,5] with a sum of 5
For [5,5,-5,-6], the largest group is [5,5] with a sum of 10
For [-1,-1,1,-1,2], the largest group is [1,-1,2] with a sum of 2
-- Press any key to exit --
И вы можете запустить его
онлайн[
^]
Обновление
Вот еще одна версия, которая обрабатывает несколько возвращаемых наборов, которые в равной степени являются максимально возможной суммой последовательных чисел.
using System;
using System.Collections.Generic;
using System.Linq;
namespace LargestGroupSum
{
static class Program
{
static void Main(string[] args)
{
Console.WriteLine("Largest possible sum of consecutive numbers");
Console.WriteLine("===========================================");
foreach (var test in new List<List<int>>()
{
new List<int>(),
new List<int>() { -1, -2, -5, -4, -5, -1, -2, -11 },
new List<int>() { 1, 2, 5, 4, 5, 1, 2, 11 },
new List<int>() { 1, 2, -5, 4, 5, -1, 2, -11 },
new List<int>() { 1, 2, 4, -20, 4, 2, 1, -15, 3, 2, 2 },
new List<int>() { 5, -5, 5, -10, 5, -5, 5 },
new List<int>() { 5, -5, 5, -5, 5 },
new List<int>() { 5, 5, -5, -6 },
new List<int>() { -1, -1, 1, -1, 2 }
})
{
var results = test.LargestGroupSumList();
Console.WriteLine($"\r\nFor [{string.Join(", ", test)}], there {(results.Count() > 1 ? "are multiple sets" : results.FirstOrDefault() == null ? "are no sets" : "is one set")}");
foreach (var lg in results)
if (lg != null) Console.WriteLine($"... the largest group is [{string.Join(", ", lg)}] with a sum of {lg.Sum()}");
}
Console.WriteLine("\r\n-- Press any key to exit --");
Console.ReadKey();
}
}
public static class HelperExtensions
{
public static IEnumerable<IList<int>> LargestGroupSumList(this IList<int> list)
{
if (!list.Any(x => x >= 1))
yield return null;
else if (!list.Any(x => x < 1))
yield return list;
else
{
var groups = new List<List<int>>();
for (int i = 0; i < list.Count; i++)
for (int j = 0; j < list.Count - i; j++)
groups.Add(list.Skip(i).Take(j + 1).ToList());
var results = groups.OrderByDescending(X => X.Count).OrderByDescending(x => x.Sum()).ToList();
int sum = results.First().Sum(), count = results.First().Count;
foreach (var item in results)
if (item.Sum().Equals(sum) && item.Count.Equals(count)) yield return item;
}
}
}
}
Imports System.Runtime.CompilerServices
Module Module1
Sub Main()
Console.WriteLine("Largest possible sum of consecutive numbers")
Console.WriteLine("===========================================")
For Each test In New List(Of List(Of Integer))() From {
New List(Of Integer)(),
New List(Of Integer)() From {-1, -2, -5, -4, -5, -1, -2, -11},
New List(Of Integer)() From {1, 2, 5, 4, 5, 1, 2, 11},
New List(Of Integer)() From {1, 2, -5, 4, 5, -1, 2, -11},
New List(Of Integer)() From {1, 2, 4, -20, 4, 2, 1, -15, 3, 2, 2},
New List(Of Integer)() From {5, -5, 5, -10, 5, -5, 5},
New List(Of Integer)() From {5, -5, 5, -5, 5},
New List(Of Integer)() From {5, 5, -5, -6},
New List(Of Integer)() From {-1, -1, 1, -1, 2}
}
Dim results = test.LargestGroupSumList()
Console.WriteLine("{0}For [{1}], there {2}", vbCrLf, String.Join(", ", test), (If(results.Count > 1, "are multiple sets", If(results.FirstOrDefault() Is Nothing, "are no sets", "is one set"))))
For Each lg In results
If lg IsNot Nothing Then
Console.WriteLine("... the largest group is [{0}] with a sum of {1}", String.Join(", ", lg), lg.Sum())
End If
Next
Next
Console.WriteLine("{0}-- Press any key to exit --", vbCrLf)
Console.ReadKey()
End Sub
End Module
Public Module HelperExtensions
<Extension>
Public Iterator Function LargestGroupSumList(list As IList(Of Integer)) As IEnumerable(Of IList(Of Integer))
If Not list.Any() OrElse Not list.Any(Function(x) x > 1) Then
Yield Nothing
ElseIf Not list.Any(Function(x) x < 1) Then
Yield list
Else
Dim groups = New List(Of List(Of Integer))()
For i As Integer = 0 To list.Count - 1
For j As Integer = 0 To list.Count - i - 1
groups.Add(list.Skip(i).Take(j + 1).ToList())
Next
Next
Dim results = groups.OrderByDescending(Function(x) x.Count).OrderByDescending(Function(x) x.Sum()).ToList()
PIEBALDconsult
Я не согласен с пустым массивом, суммирующимся до нуля.
Graeme_Grant
Мы должны возвращать только массив, но показывать значение суммы-это бонус. Вместо этого вы можете использовать этот вывод:
Console.WriteLine($"For [{string.Join(",", test)}], the largest group is [{string.Join(",", lg)}] with {(lg.Any() ? $"a sum of {lg.Sum()}" : "no value")}");
Graeme_Grant
Добавлено обновление, которое не имеет суммы для пустых результатов и теперь обрабатывает несколько наборов с максимально возможной суммой.
Bryian Tan
Каким должен быть ответ на [5,5, -5,-6]?
Graeme_Grant
For [5, 5, -5, -6], there is one set
... the largest group is [5, 5] with a sum of 10
Graeme_Grant
В этом решении есть ссылки выше, где вы можете ввести свои собственные числа и протестировать их. :)
Graeme_Grant
Вместо того чтобы обновлять решение, вот еще один тестовый набор с результатами:
For [1, 2, 4, -20, 4, 2, 1, -15, 3, 2, 2], there are multiple sets
... the largest group is [1, 2, 4] with a sum of 7
... the largest group is [4, 2, 1] with a sum of 7
... the largest group is [3, 2, 2] with a sum of 7
Bryian Tan
еще один вопрос :) {9,-2,8,-1,-6} , почему самая большая группа - это [9,-2,8], хотя это должны быть последовательные числа
Graeme_Grant
Последовательный (один за другим), а не инкрементный.
Bryian Tan
Понял. Спасибо.
Richard Deeming
!list.Any() || !list.Any(x => x > 1) ? ... : !list.Any(x => x < 1) ? ... : ...
Сколько раз вы собираетесь повторять этот список? :P
Вы, конечно, можете удалить первый вызов, чтобы
Any
- если в списке нет элементов, то в списке также не будет элементов больше 1.
Также может быть проще следовать логике, если вы замените
!list.Any(condition)
с
list.All(!condition)
:
list.All(x => x <= 1) ? ... : list.All(x => x >= 1) ? ... : ...
Это сразу же делает очевидным, что первое условие должно быть
list.All(x => x < 1)
, нет
list.All(x => x <= 1)
.
(Так что ваша версия должна быть:
!list.Any(x => x >= 1)
)
.OrderByDescending(x => x.Count).OrderByDescending(x => x.Sum())
Зовущий
OrderBy[Descending]
отрицает любой предыдущий заказ. Вы должны либо удалить первый
OrderByDescending
позвоните или измените второй на
ThenByDescending
если вы хотите отсортировать по двум разным критериям.
Graeme_Grant
Я внес некоторые изменения, которые отражают некоторые из сделанных предложений. Спасибо! :)
Рейтинг:
2
Patrice T
Вариант решения, который соответствует частному случаю отрицательного списка, как указано.
*
clear
test({})
test({-1, -2, -5, -4, -5, -1, -2, -11})
test({1, 2, 5, 4, 5, 1, 2, 11})
test({1, 2, -5, 4, 5, -1, 2, -11})
test({5, -5, 5, -10, 5, -5, 5})
return
procedure test(lst)
? atos(lst)
tmp= max_tot(lst)
? atos(tmp)
? "Total="
tot= 0
aeval(tmp, {|_1| tot += _1})
?? tot
?
return
function max_tot(lst)
rep={}
if len(lst) != 0
cumul= array(len(lst)+ 1)
cumul[1]= 0
for scan= 1 to len(lst)
cumul[scan+1]= cumul[scan]+ lst[scan]
next
bestd= 1
bestf= 2
bestv= cumul[2]
for scand= 1 to len(cumul)-1
for scanf= scand+1 to len(cumul)
if bestv< cumul[scanf]-cumul[scand]
bestd= scand
bestf= scanf
bestv= cumul[scanf]-cumul[scand]
endif
next
next
if bestv > 0
for scan= bestd to bestf-1
aadd(rep, lst[scan])
next
endif
endif
return rep
function atos(lst)
rep="{"
for scan= 1 to len(lst)
if scan != 1
rep += ","
endif
rep += str(lst[scan],,,.T.)
next
rep += "}"
return rep
{}
{}
Total= 0
{-1,-2,-5,-4,-5,-1,-2,-11}
{}
Total= 0
{1,2,5,4,5,1,2,11}
{1,2,5,4,5,1,2,11}
Total= 31
{1,2,-5,4,5,-1,2,-11}
{4,5,-1,2}
Total= 10
{5,-5,5,-10,5,-5,5}
{5}
Total= 5
Graeme_Grant
Вам нужно проверить последний тест... Для {5,-5,5,-10,5,-5,5}, самая большая группа - {5,-5,5} с суммой 5
Patrice T
Да,но не в таком виде.
требование-это последовательность с наибольшей суммой, а не самая большая последовательность с наибольшей суммой.
Graeme_Grant
Существует несколько последовательностей с одинаковой суммой 5-4 x [5]s и 2 x [5,-5,5]. Почему самый короткий массив является правильным и какой из 4? Очевидный ответ - самые длинные массивы.
Но вот еще один с 3 разными результатами с той же суммой, который является правильным? [1, 2, 4, -20, 4, 2, 1, -15, 3, 2, 2] - я чувствую, что все они одинаково верны.
Patrice T
"Очевидный ответ - самые длинные массивы."
Ваше мнение.
Я не говорю, что одна последовательность лучше другой.
Я просто перечисляю первый из них, который удовлетворяет этому требованию.
Graeme_Grant
"найти набор последовательных чисел" подразумевает самый длинный набор.
Patrice T
мы не говорим на одном английском языке.
Рейтинг:
1
Peter Leow
Быстрый, чтобы присоединиться к жаре:
def largestSummedConsecutiveSubArray(integer_list):
running_sum = 0
result_lists = []
temp_list = []
for integer in integer_list:
running_sum = running_sum + integer
if running_sum >= 0:
temp_list.append(integer)
else:
result_lists.append(temp_list)
temp_list = []
running_sum = 0
if len(temp_list) > 0:
result_lists.append(temp_list)
largest_summed_consecutive_subArray = []
max_sum = 0
for i in result_lists:
if sum(i) > max_sum:
max_sum = sum(i)
largest_summed_consecutive_subArray = i
return largest_summed_consecutive_subArray
#integer_list = []
#integer_list = [-1, -2, -5, -4, -5, -1, -2, -11]
#integer_list = [1, 2, 5, 4, 5, 1, 2, 11]
integer_list = [1, 2, -5, 4, 5, -1, 2, -11]
largest_summed_consecutive_subArray = largestSummedConsecutiveSubArray(integer_list)
print('For the original integer array of {}'.format(integer_list))
print('The largest summed consecutive sub array is {} with a sum of {}.'.format(largest_summed_consecutive_subArray, sum(largest_summed_consecutive_subArray)))
Выход:
For the original integer array of []
The largest summed consecutive sub array is [] with a sum of 0.
For the original integer array of [-1, -2, -5, -4, -5, -1, -2, -11]
The largest summed consecutive sub array is [] with a sum of 0.
For the original integer array of [1, 2, 5, 4, 5, 1, 2, 11]
The largest summed consecutive sub array is [1, 2, 5, 4, 5, 1, 2, 11] with a sum of 31.
For the original integer array of [1, 2, -5, 4, 5, -1, 2, -11]
The largest summed consecutive sub array is [4, 5, -1, 2] with a sum of 10.
Играть в нее онлайн[^].
++ + + + [Раунд 2]+++++
Спасибо Брайан Тан за тестирование и указание на ошибку. Похоже, что предыдущий код прерывается, когда отрицательное целое число включается в качестве последнего элемента в массив потенциальных решений. Таким образом, исправление состоит в том, чтобы удалить это отрицательное целое число, если оно присутствует в качестве последнего элемента в массиве потенциальных решений. Для этого создается функция:
# Remove last element if negative from a list
def removeLastNegativeFromList(aList):
for t in reversed(aList):
if t > 0:
break
else:
aList.remove(t)
return aList
def largestSummedConsecutiveSubArray(integer_list):
running_sum = 0
result_lists = []
temp_list = []
for integer in integer_list:
running_sum = running_sum + integer
if running_sum >= 0:
temp_list.append(integer)
else:
temp_list = removeLastNegativeFromList(temp_list)
result_lists.append(temp_list)
temp_list = []
running_sum = 0
if len(temp_list) > 0:
temp_list = removeLastNegativeFromList(temp_list)
result_lists.append(temp_list)
largest_summed_consecutive_subArray = []
max_sum = 0
for i in result_lists:
if sum(i) > max_sum:
max_sum = sum(i)
largest_summed_consecutive_subArray = i
return largest_summed_consecutive_subArray
#integer_list = []
#integer_list = [-1, -2, -5, -4, -5, -1, -2, -11]
#integer_list = [1, 2, 5, 4, 5, 1, 2, 11]
#integer_list = [1, 2, -5, 4, 5, -1, 2, -11]
#integer_list = [5,5,-3,-6]
#integer_list = [5,5,-5,-6]
integer_list = [5,5,-8,-6]
largest_summed_consecutive_subArray = largestSummedConsecutiveSubArray(integer_list)
print('For the original integer array of {}'.format(integer_list))
print('The largest summed consecutive sub array is {} with a sum of {}.'.format(largest_summed_consecutive_subArray, sum(largest_summed_consecutive_subArray)))
Демонстрация и тестирование на
Задача кодирования: максимально возможная сумма из последовательных чисел v2, Python 3 - rextester[
^]
+ + + + + [Раунд 3]+++++
Как указал Graeme_Grant, может быть несколько вхождений суб-массивов, удовлетворяющих наибольшей сумме, поэтому я изменил часть кода, чтобы учесть такой сценарий:
largest_summed_consecutive_subArray = result_lists[:]
for i in largest_summed_consecutive_subArray:
for j in result_lists:
if sum(i) < sum(j):
largest_summed_consecutive_subArray.remove(i)
break
Результирующий код является
# Remove last element if negative from a list
def removeLastNegativeFromList(aList):
for t in reversed(aList):
if t > 0:
break
else:
aList.remove(t)
return aList
def largestSummedConsecutiveSubArray(integer_list):
running_sum = 0
result_lists = []
temp_list = []
for integer in integer_list:
running_sum = running_sum + integer
if running_sum >= 0:
temp_list.append(integer)
else:
temp_list = removeLastNegativeFromList(temp_list)
result_lists.append(temp_list)
temp_list = []
running_sum = 0
if len(temp_list) > 0:
temp_list = removeLastNegativeFromList(temp_list)
result_lists.append(temp_list)
largest_summed_consecutive_subArray = result_lists[:]
for i in largest_summed_consecutive_subArray[:]: # fixed this!
for j in result_lists:
if sum(i) < sum(j):
largest_summed_consecutive_subArray.remove(i)
break
return largest_summed_consecutive_subArray
#integer_list = []
#integer_list = [-1, -2, -5, -4, -5, -1, -2, -11]
#integer_list = [1, 2, 5, 4, 5, 1, 2, 11]
#integer_list = [1, 2, -5, 4, 5, -1, 2, -11]
#integer_list = [5,5,-3,-6]
#integer_list = [5,5,-5,-6]
#integer_list = [1, 2, 4, -20, 4, 2, 1, -15, 3, 2, 2]
#integer_list = [5,-5,5,-10,5,-5,5]
integer_list = [-1, -1, 1, -1, 2]
largest_summed_consecutive_subArray = largestSummedConsecutiveSubArray(integer_list)
print('For the original integer array of {}'.format(integer_list))
if (largest_summed_consecutive_subArray == [] or largest_summed_consecutive_subArray[0] == []):
largest_summed_consecutive_subArray = []
sum = None
else:
sum = sum(largest_summed_consecutive_subArray[0])
print('The largest summed consecutive sub array: {} with a sum of {}.'.format(largest_summed_consecutive_subArray, sum))
или в
Задача кодирования: максимально возможная сумма из последовательных чисел v4, Python 3 - rextester[
^]
Примерные выходные данные:
For the original integer array of []
The largest summed consecutive sub array: [] with a sum of None.
For the original integer array of [-1, -2, -5, -4, -5, -1, -2, -11]
The largest summed consecutive sub array: [] with a sum of None.
For the original integer array of [1, 2, 5, 4, 5, 1, 2, 11]
The largest summed consecutive sub array: [[1, 2, 5, 4, 5, 1, 2, 11]] with a sum of 31.
For the original integer array of [1, 2, -5, 4, 5, -1, 2, -11]
The largest summed consecutive sub array: [[4, 5, -1, 2]] with a sum of 10.
For the original integer array of [5, 5, -3, -6]
The largest summed consecutive sub array: [[5, 5]] with a sum of 10.
For the original integer array of [5, 5, -5, -6]
The largest summed consecutive sub array: [[5, 5]] with a sum of 10.
For the original integer array of [1, 2, 4, -20, 4, 2, 1, -15, 3, 2, 2]
The largest summed consecutive sub array: [[1, 2, 4], [4, 2, 1], [3, 2, 2]] with a sum of 7.
For the original integer array of [5, -5, 5, -10, 5, -5, 5]
The largest summed consecutive sub array: [[5, -5, 5], [5, -5, 5]] with a sum of 5.
For the original integer array of [-1, -1, 1, -1, 2]
The largest summed consecutive sub array: [[1, -1, 2]] with a sum of 2.
Исправлена ошибка!
Bryian Tan
Каким должен быть ответ на [5,5, -5,-6]?
Peter Leow
Это нарушает кодекс. Спасибо за тестирование.
Graeme_Grant
Также попробуйте [1, 2, 4, -20, 4, 2, 1, -15, 3, 2, 2] - есть 3 различных варианта...
Также [5,-5,5,-10,5,-5,5] & [5,-5,5, -5,5] от PIEBALDConsult...
Наконец, должен ли пустой массив [] вычисляться до значения (как указано PIEBALDConsult) или нулевого значения?
Peter Leow
Просто исправьте это после того, как получите обратную связь от Брайана Тана. Спасибо вам, ребята, за то, что вы его проверили. Код-это не элегантный, а просто быстрый способ уловить логику. Что касается того, является ли нуль или ноль для пустого-это просто вопрос, если еще ИМХО, так что до отдельного человека.
Graeme_Grant
Просто попробовал и хорошо работает. Хотя он не обрабатывает более одного возможного решения/ответа, только первый.
Peter Leow
Я только что включил несколько суб-массивов. Что касается [5, -5, 5, -5, 5], приемлемый суб-массив является спорным.
Graeme_Grant
Выглядеть хорошо. :)
Да, [5, -5, 5, -5, 5] это очень интересно. Я думаю, хотя сумма результата и размер массива-это все, что имеет значение - если он вписывается в определенные правила, то он действителен.
Peter Leow
Спасибо за обратную связь, просто исправьте это. Надеюсь, теперь это сработает.
Bryian Tan
Приятно!!! Извините, но я должен добавить еще один. [-1, -1, 1, -1, 2] должно быть 2, верно? вместо []
PIEBALDconsult
Если вы ищете самый длинный подмассив с наибольшей суммой, то это [ 1, -1, 2 ]
Bryian Tan
Хорошо, тогда сумма должна быть равна 2. Спасибо.
Peter Leow
Спасибо еще раз. Это помогает мне обнаружить одну ошибку помета:
для меня в largest_summed_consecutive_subArray[:]:
Исправлено и работает хорошо. Кажется...
Bryian Tan
потрясающий соус !!!