查找未知数字的数字之间的最小可能差异

时间:2016-11-03 07:48:54

标签: php regex numbers difference

我有一些案例如下。

  • 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 :(得分:5)

好的,我有一个解决方案。

说明:

使用正则表达式获取两个数字,然后从左到右成对比较它们,从他们相等的假设开始。这意味着他们在任何可能的情况下都会解析为相同的数字,如果它们都是?,则为0。

在有一对不相等的数字后,它会开始将较低的?&#39}设置为9,而较高的?设置为0 &{39}到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"; } ,使它们尽可能接近。

Here就是它的一个例子。

HMENU