Как найти потолок и пол для номера из набора номеров? - PullRequest
0 голосов
/ 15 апреля 2010
1st number:  50
2.           30
3.           70
4.           40
5.           11

и другой номер 33

Мне нужно вычислить, между какими двумя числами находится последнее число (с использованием php) .. любая помощь?

Ответы [ 3 ]

5 голосов
/ 15 апреля 2010

Переберите ваш список и найдите следующие два значения:

  • Наибольшее число, которое меньше вашего целевого числа.
  • Наименьшее число, которое больше целевого числа.

В псевдокоде:

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

Тогда lowerlimit и upperlimit - ваш ответ. Этот алгоритм требует O (n) времени и O (1) дополнительного пространства.

Если вы собираетесь протестировать один и тот же список с множеством разных целевых чисел, то может иметь смысл сначала отсортировать список, требующий времени O (n log (n)), но затем вы можете найти пределы всего за O (log (n)) время с использованием бинарного поиска.

2 голосов
/ 15 апреля 2010

Я не дам вам код, но дам некоторые рекомендации для вашей домашней работы.

Вам необходимо выполнить эти шаги, чтобы решить вашу проблему.

  • Сортировка списка номеров. (Я полагаю, вы храните их в массиве, поэтому сортируйте массив.)
  • С помощью цикла 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
0 голосов
/ 15 апреля 2010

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));

Я не знаю, правильно ли я понял, но, похоже, это так

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...