Найти минимально возможную разницу между числами с неизвестными цифрами

У меня есть несколько случаев следующим образом.

  • 1? 2?
  • ?2? ??3
  • ? ?
  • ?5 ?0

теперь я должен найти некоторые значения вместо вопросительных знаков, которые дали бы минимально возможную разницу между 2 числами.

ответы должны быть как

  • 19 20

  • 023 023

  • 0 0

  • 05 00

Примечание: число, которое будет произведено после минимальной абсолютной разницы между 2 значениями, должно быть наименьшим. Как и в последнем случае, может быть 15 и 10 с абсолютной разницей в 5, но она недействительна.

я попробовал некоторые идеи комбинации перестановок для замены вопросительных знаков для обоих чисел по отдельности, а затем узнать число, но длина числа может доходить до 18 цифр в число. Поэтому я считаю, что это не очень хорошая идея.

затем я попытался найти аналогичные вопросы, но это не помогло. Я все еще думаю, что regex может быть полезно, чтобы решить этот вопрос, но я застрял с тем, как это сделать.

любая помощь приветствуется!! Танкс!

язык должен быть Php.. Я работаю с Php.

1 ответов


хорошо, у меня есть решение.

объяснение:

использует регулярное выражение для захвата двух чисел, а затем сравнивает их в парах слева направо, начиная с предположения, что они равны. Это означает, что они оба разрешаются на одно и то же число, где это возможно, или 0, если они оба ?.

после того, как есть пара чисел, которые не равны, он начинает устанавливать нижние?С 9, а высшие ?С 0, чтобы сделать их как можно ближе по возможности.

здесь пример этого в действии.

function minDiff($str) {
    preg_match("/([\d\?]+) ([\d\?]+)/", $str, $matches);

    $first = $matches[1];
    $second = $matches[2];

    $biggest = 0; // -1 = first, 0 = none, 1 = second

    $firstResult = 0;
    $secondResult = 0;

    for ($i = 0; $i < strlen($first); $i++) {
        $powerValue = strlen($first) - $i - 1;
        if ($biggest != 0) { // not equal
            if (!strcmp($first[$i], '?') && !strcmp($second[$i], '?')) {
                if ($biggest > 0) { // second is biggest
                    $firstResult += 9 * pow(10, $powerValue);
                } else { // first is biggest
                    $secondResult += 9 * pow(10, $powerValue);
                }
            } elseif (!strcmp($first[$i], '?')) {
                if ($biggest > 0) { // second is biggest
                    $firstResult += 9 * pow(10, $powerValue);
                }
                $secondResult += $second[$i] * pow(10, $powerValue);
            } elseif (!strcmp($second[$i], '?')) {
                if ($biggest < 0) { // first is biggest
                    $secondResult += 9 * pow(10, $powerValue);
                }
                $firstResult += $first[$i] * pow(10, $powerValue);
            } else {
                $firstResult += $first[$i] * pow(10, $powerValue);
                $secondResult += $second[$i] * pow(10, $powerValue);
            }
        } else { // both equal (so far)
            if (!strcmp($first[$i], '?')) {
                $firstResult += $second[$i] * pow(10, $powerValue);
                $secondResult += $second[$i] * pow(10, $powerValue);
            } elseif (!strcmp($second[$i], '?')) {
                $firstResult += $first[$i] * pow(10, $powerValue);
                $secondResult += $first[$i] * pow(10, $powerValue);
            } else {
                if (intval($first[$i]) > intval($second[$i])) {
                    $biggest = -1;
                } elseif (intval($first[$i]) < intval($second[$i])) {
                    $biggest = 1;
                }
                $firstResult += $first[$i] * pow(10, $powerValue);
                $secondResult += $second[$i] * pow(10, $powerValue);
            }

            // Find if next number will change
            if (($i + 1) < strlen($first) && strcmp($first[$i + 1], '?') && strcmp($second[$i + 1], '?')) {
                $diff = preg_replace('/\?/', '0', substr($first, $i + 1)) - preg_replace('/\?/', '0', substr($second, $i + 1));
                echo "$diff\n";
                // Check to see if you need to add 1 to the value for this loop
                if ($diff > pow(10, $powerValue) / 2) {
                    $secondResult += pow(10, $powerValue);
                    $biggest = 1;
                } elseif ($diff < pow(10, $powerValue) / -2) {
                    $firstResult += pow(10, $powerValue);
                    $biggest = -1;
                }
            }
        }
    }

    echo "first: ".str_pad($firstResult, strlen($first), "0", STR_PAD_LEFT)."\n";
    echo "second: ".str_pad($secondResult, strlen($second), "0", STR_PAD_LEFT)."\n\n";
}