Найти минимально возможную разницу между числами с неизвестными цифрами
У меня есть несколько случаев следующим образом.
- 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";
}