Nasıl bir sayı kümesinden bir sayı için tavan ve zemin buluyorsunuz?

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

ve diğer sayısı 33

Ben son numarası (php kullanarak) arasında olan iki sayı hesaplamak gerekir .. herhangi bir yardım?

3 Cevap

Listenizde üzerinde yineleme ve aşağıdaki iki değerleri bulabilirsiniz:

  • Hedef sayısından daha az olduğu büyük sayı.
  • Hedef sayısından daha büyük en küçük sayı.

Pseudo-code:

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

Sonra lowerlimit ve upperlimit cevap vardır. Bu algoritma O (n) zaman ve O (1) ekstra alan gerektirir.

Birçok farklı hedef numaraları ile aynı listeyi test etmek için gidiyoruz eğer o zaman (n) (log n) birinci O gerektiren sıralamak için mantıklı olabilir, ama sonra) n (sadece O (günlüğünde sınırlarını bulabilirsiniz Bir ikili arama kullanarak) zamanı.

Sana kodunu verir ama size ev ödevi için bazı yönergeler vermek değil edeceğiz.

Eğer sorunu çözmek için şu adımları yapmanız gerekir.

  • Numaralarının listesini sıralamak. (Ben bu kadar dizi sıralamak bir dizide saklayarak sanırım.)
  • Bir ile eleman N senin sayısından daha büyük ve eleman N-1 küçük olduğu yer için döngü arama için. İşte size konumunu verecektir.
  • Oh ve gerçekten uzun döngü önlemek için. Eğer pozisyon bulduktan sonra "break" kullanın.

Sırala listesi:

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

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

Ben doğru anladım olmadığını bilmiyorum ama bu gibi görünüyor