Попалась задачка на собеседовании: есть нули и единицы в массиве. Надо для каждого нуля посчитать сколько единиц правее него и вывести сумму таких чисел. Сделать за один проход.
Допустим есть массив из нулей и единиц:
int[] z = { 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1 };
Увидев 0 нужно посчитать все числа, после него и записать в переменную(или нет) то есть 12. следующий 11, 6, 3, 2, 1. В итоге должно получиться 35. Подскажите как это сделать программно в рамках задачи.
Можно написать такой метод расширения для аккумуляции:
static class Extensions
{
public static IEnumerable<int> Accumulate<T>(
this IEnumerable<T> source, Func<T, bool> condition)
{
int count = 0;
foreach (var x in source)
if (condition(x)) count++;
else yield return count;
}
}
И использовать его так:
int[] z = { 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1 };
foreach (var x in z.Reverse().Accumulate(x => x == 1).Reverse())
Console.WriteLine(x);
Проход с начала
int[] z = { 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1 };
var sum = 0;
var mult = 0;
for(var i=0; i<z.Length; i++)
{
if (z[i] == 0) mult++;
else sum += mult;
}
Console.WriteLine(sum);
Проход с конца
int[] z = { 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1 };
var sum = 0;
var ones = 0;
for(var i=z.Length-1; i>=0; i--)
{
if (z[i] == 1) ones++;
else sum += ones;
}
Console.WriteLine(sum);
Можно сделать вот так, начиная проход с начала. Обозначаем в консоли ноль и считаем после него количество единиц:
bool Null = false;
int sum = 0;
int[] array = { 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1 };
foreach (int x in array)
{
if (x == 0)
{
Console.WriteLine("Null");
if (Null == false)
Null = true;
else if (Null == true)
{
sum = 0;
}
}
if (x == 1)
{
if (Null == true)
{
sum++;
Console.WriteLine(sum);
}
}
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости