Лучший алгоритм, чтобы найти следующий более высокий номер в Perl - PullRequest
0 голосов
/ 10 июня 2018

Я пытался найти предыдущие темы, похожие на мой вопрос, но не нашел.

Рассмотрим функцию, которая получает массив и число.Я хотел бы найти следующее более высокое число.

Пример:

Ввод: arr = {2,5,3,8,15,10}, number = 6

Выход: 8, потому что 6 < 8.

Какой лучший алгоритм для этого в Perl?

Редактировать: Что я пробовал:

my @arr = (2,5,3,8,15,10);
my $number = 6;
my $next_largest = 10000000;
foreach my $val (@arr) {
    if($number < $val && $next_largest > $val) {
        $next_largest = $val;
    }
}

if(defined($next_largest)) {
    print $next_largest."\n";
}

Есть ли способ без объявления $next_largest = 10000000?это не выглядит очень хорошо, и это не обрабатывает случай значения выше, чем это значение.Также, если я попытаюсь $next_lergest без номера, это не сработает.

Лучше всего я имел в виду - лучше всего выглядеть (время не так важно).

Ответы [ 4 ]

0 голосов
/ 11 июня 2018

Это тоже так:

use strict;
use warnings;
my @arr = (2,5,3,8,15,10);
my $number = 6;
my $next_largest = (sort {$a <=> $b} grep {$_ > $number} @arr)[0];
if(defined($next_largest)) {
    print $next_largest."\n";
}
0 голосов
/ 10 июня 2018
use List::Util 'min';
my @arr = (2,5,3,8,15,10);
my $number = 6;
my $next_largest = min grep $_ > $number, @arr;

if(defined($next_largest)) {
    print $next_largest."\n";
}
0 голосов
/ 10 июня 2018

Вы можете использовать $number в качестве часового значения:

my @arr = (2,5,3,8,15,10);
my $number = 6;
my $next_largest = $number;
foreach (@arr) {
    if($number < $_ && ($next_largest == $number || $next_largest > $_)) {
        $next_largest = $_;
    }
}

if($next_largest > $number) {
    print $next_largest."\n";
}

Это исключает произвольное большое значение в вашем коде и печатает результат, только если был найден элемент, строго превышающий $number.

Примечание: ответ @ ysth гораздо более элегантный, но мой может быть немного более эффективным с точки зрения памяти.

0 голосов
/ 10 июня 2018

Сначала отсортируйте массив в порядке возрастания чисел.Затем просматривайте элементы в массиве, пока не найдете большее число.

my $input_number = 6;

my @array = (2, 5, 3, 8, 15, 10);
my @sorted_array = sort { $a <=> $b } @array;

my $found = 0;
my $next_number;

foreach (@sorted_array) {
    my $loop_number = $_;

    if ($loop_number > $input_number) {
        $next_number = $loop_number;
        $found = 1;
        last;
    }
}

if ($found == 1) {
    print "next higher number for " + input_number + " is: " + next_number;
} else {
    print "no next higher number found";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...