Как посчитать сумму всех чисел для каждого нуля в массиве c#

247
25 декабря 2018, 20:40

Попалась задачка на собеседовании: есть нули и единицы в массиве. Надо для каждого нуля посчитать сколько единиц правее него и вывести сумму таких чисел. Сделать за один проход.

Допустим есть массив из нулей и единиц:

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. Подскажите как это сделать программно в рамках задачи.

Answer 1

Можно написать такой метод расширения для аккумуляции:

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);
Answer 2

Проход с начала

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); 
Answer 3

Можно сделать вот так, начиная проход с начала. Обозначаем в консоли ноль и считаем после него количество единиц:

        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);
                }
            }
        }
READ ALSO
apach24+.htaccess+php error 500

apach24+.htaccess+php error 500

Проблема такая, при переносе онлайн игры на другой хостинг возникает ошибки следующего родаСразу говорю ссылки все нормальные не битые

177
Вывод одного потом другого

Вывод одного потом другого

Вопрос такой: дан массив, нужно чтобы с начало выводились те слова длинна которых больше 6, а остальное ниже И что тут не так ?

133
Таймер на PHP как реализовать?

Таймер на PHP как реализовать?

Я хочу создать функцию, которая будет запрещать флудить, то есть, чтобы можно было писать сообщение раз в 5 секунд, к примеруХочу понять сам...

161
как построить график в yii с помощью yii2-highcharts-widget

как построить график в yii с помощью yii2-highcharts-widget

Пытаюсь разобраться с тем, как построить график при помощи расширения yii2-highcharts-widget, чтобы по оси X шли месяцы, а по оси Y Вот код из оффдоки:

162