Величайшее маленькое свидание - PullRequest
1 голос
/ 06 августа 2020

У меня есть два столбца даты, скажем, A и B в двух отдельных таблицах. A содержит информацию о дате испытания, а столбец B содержит дату, когда завод был откалиброван. Я хочу получить информацию о том, сколько дней прошло с момента последней калибровки на заводе.

Например:

A=['2020-02-26', '2020-02-27', '2020-02-28', '2020-02-29']

B=['2020-02-24', '2020-02-28']

Days_Passed с момента последней калибровки, соответствующей A, являются [2,3,0,1]

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

, если даты в A и B равны в порядке , это можно сделать в O(n+m), где n и m - это длина A и B . хотя вы не упомянули о языке программирования, это реализация в C#

основной части:

foreach (var testedDate in testedDates)
{
    if (nextCalibratedDate.HasValue && (testedDate - nextCalibratedDate.Value).Days >= 0)
    {
        Console.WriteLine((testedDate - nextCalibratedDate.Value).Days);
        calibratedDate = nextCalibratedDate.Value;
        if (enumerator.MoveNext())
        {
            nextCalibratedDate = (DateTime?)enumerator.Current;
        }
    }
    else
    {
        Console.WriteLine((testedDate - calibratedDate).Days);
    }
}

, и это полный код:

public static void Main(string[] args)
{
    string[] A = new[] { "2020-02-26", "2020-02-27", "2020-02-28", "2020-02-29" };
    string[] B = new[] { "2020-02-24", "2020-02-28" };

    var testedDates = A
        .Select(x => DateTime.Parse(x))
        .ToArray();
    var calibratedDates = B
        .Select(x => DateTime.Parse(x))
        .ToArray();

    var enumerator = calibratedDates.GetEnumerator();
    enumerator.MoveNext();
    var calibratedDate = (DateTime)enumerator.Current;
    DateTime? nextCalibratedDate = default;
    if (enumerator.MoveNext())
    {
        nextCalibratedDate = (DateTime?)enumerator.Current;
    }

    foreach (var testedDate in testedDates)
    {
        if (nextCalibratedDate.HasValue && (testedDate - nextCalibratedDate.Value).Days >= 0)
        {
            Console.WriteLine((testedDate - nextCalibratedDate.Value).Days);
            calibratedDate = nextCalibratedDate.Value;
            if (enumerator.MoveNext())
            {
                nextCalibratedDate = (DateTime?)enumerator.Current;
            }
        }
        else
        {
            Console.WriteLine((testedDate - calibratedDate).Days);
        }
    }
}
0 голосов
/ 06 августа 2020

Возьмите наименьшую дату в качестве ссылки 0 и преобразуйте другие даты в дни относительно 0 (наименьшая дата)

A = [2,3,4,5]

B = [ 0,4]

для каждого значения A, выполнить двоичный поиск, чтобы найти ближайшее наименьшее или равное значение в B ... Их вычитание будет Количество дней, прошедших с момента последней калибровки.

Массив ответов = [2,3,0,1].

...