如何从一组数字中找到数字的天花板和地板?

时间:2010-04-15 11:32:16

标签: php algorithm

1st number:  50
2.           30
3.           70
4.           40
5.           11

和其他数字是33

我需要计算最后一个数字之间的两个数字(使用php)..任何帮助?

3 个答案:

答案 0 :(得分:5)

迭代您的列表并找到以下两个值:

  • 小于目标号码的最大数字。
  • 大于目标号码的最小数字。

在伪代码中:

lowerlimit = Unknown
upperlimit = Unknown
for each n in list:
    if (n <= target) and (lowerlimit is Unknown or n > lowerlimit):
        lowerlimit = n
    if (n >= target) and (upperlimit is Unknown or n < upperlimit):
        upperlimit = n

然后lowerlimitupperlimit就是您的答案。该算法需要O(n)时间和O(1)额外空间。

如果您要测试具有许多不同目标编号的相同列表,那么首先需要O(n log(n))时间对列表进行排序是有意义的,但是您可以在O(log)中找到限制(n))使用二分搜索的时间。

答案 1 :(得分:2)

我不会给你代码,但会为你的作业提供一些指导。

您需要执行以下步骤来解决问题。

  • 对您的数字列表进行排序。 (我猜你将它们存储在一个数组中,所以对数组进行排序。)
  • 使用for循环搜索元素N大于数字的位置,元素N-1更小。这会给你你的位置。
  • 哦,避免真正的长循环。找到你的职位后使用“休息”。

排序清单:

11
30
 // your 33 is bigger than 30 and smaller than 40, so this is the position you want.
40
50
70

答案 2 :(得分:0)


function isBetween($several_numbers, $number)
{
   $return_numbers = array();
   sort($several_numbers);
   $j = 0;
   //find the first number in the array that $number is bigger than
   while($number > $several_numbers[$j])  $j++;
   if ($j == 0 || $j > count($several_numbers) - 1) return array();
   $return_numbers[0] = $several_numbers[$j-1];
   while($number > $several_numbers[$j]) $j++;
   if ($j > count($several_numbers)-1) return array();
   $return_numbers[1] = $several_numbers[$j];
   return $return_numbers;
}
print_r(isBetween(array(50, 30, 70, 40, 10), 33));

我不知道我是否理解正确,但这似乎是