我试图找到类似于我的问题的先前线程,但没有找到。
考虑一个获取数组和数字的函数。我想找到下一个更高的数字。
示例:
输入: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
,则无效。
我认为 - 最好看(时间并不重要)。
答案 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";
}