在perl中查找下一个更高数字的最佳算法

时间:2018-06-10 15:33:22

标签: algorithm perl

我试图找到类似于我的问题的先前线程,但没有找到。

考虑一个获取数组和数字的函数。我想找到下一个更高的数字。

示例:

输入: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 :(得分:7)

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";
}

答案 1 :(得分:0)

首先,按数字升序对数组进行排序。然后循环遍历数组中的元素,直到找到更高的数字。

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";
}

答案 2 :(得分:0)

您可以使用$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的元素时才打印结果。

注意:answer by @ysth更优雅,但我的内存效率可能更高。

答案 3 :(得分:0)

这也是这样:

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";
}