如何在Perl中查找整数数组中的最大值和最小值?
我有一个值为33,32,8100的数组 如何在此数组中找到最大值和最小值 我需要包括任何特殊的库吗?我想这就是你要找的。你可以用它来计算最小值、最大值等你可以很容易地用它来计算,例如如何在Perl中查找整数数组中的最大值和最小值?,perl,Perl,我有一个值为33,32,8100的数组 如何在此数组中找到最大值和最小值 我需要包括任何特殊的库吗?我想这就是你要找的。你可以用它来计算最小值、最大值等你可以很容易地用它来计算,例如 use List::Util qw(min max); my @arr = (33, 32, 8, 100); print min(@arr)," ", max(@arr), "\n"; 使用,建议您无论如何都要熟悉它,就像List::MoreUtils: D:\ :: perl -MList::Util=max
use List::Util qw(min max);
my @arr = (33, 32, 8, 100);
print min(@arr)," ", max(@arr), "\n";
使用,建议您无论如何都要熟悉它,就像List::MoreUtils
:
D:\ :: perl -MList::Util=max -lwe "print max 324, 43, 53, 3532, 43"
3532
D:\ :: perl -MList::Util=min -lwe "print min 324, 43, 53, 3532, 43"
43
具有“max”和“min”函数,可用于在给定的数字列表中直接查找最大值和最小值。看看你能不能用。您还可以对数组进行排序,然后确定应该使用的最高和最低数字,该数字自v5.7.3以来随Perl发行版发布,因此可能不需要安装
use strict;
use warnings;
use feature 'say';
use List::Util qw/ max min /;
my @data = (33, 32, 8, 100);
say min @data;
say max @data;
输出
8
100
提供的解决方案很好,但如果您想自己实现,则非常简单:
use strict;
use warnings;
my @array = (33, 32, 8, 100);
my ($min, $max);
for (@array) {
$min = $_ if !$min || $_ < $min;
$max = $_ if !$max || $_ > $max
};
print "min: $min\n";
print "max: $max\n";
使用严格;
使用警告;
my@array=(33,32,8100);
我的($min,$max);
for(@array){
$min=$\uIf!$min |$\uIf<$min;
$max=$\uuIf!$max | |$\uIf>$max
};
打印“最小:$min\n”;
打印“最大:$max\n”;
不带模块:
#!/usr/bin/perl
use strict;
use warnings;
my @array = sort { $a <=> $b } qw(33 32 8 100);
print "min: $array[0]\n";
print "max: $array[-1]\n";
#/usr/bin/perl
严格使用;
使用警告;
my@array=sort{$a$b}qw(33328100);
打印“最小:$array[0]\n”;
打印“最大:$array[-1]\n”;
的min
和max
很好
use List::Util qw( min max );
my $min = min @numbers;
my $max = max @numbers;
但是当您同时需要最小值和最大值时,minmax
的效率更高(因为它进行的比较更少)
List::Util是core的一部分,但List::MoreUtils不是。当然,如果您希望同时获取列表的最大值和最小值,那么同时获取这两个值会更有效;它只需对每2项数据执行3次订单比较,而不是4次。如果数据集足够大,这可能很重要
List::Util
不提供minmax
函数,但List::MoreUtils
提供
use strict;
use warnings;
use feature qw( say );
use List::MoreUtils qw( minmax );
my ( $min, $max ) = minmax @data;
say $min;
say $max;
有关数字:
my ($min,$max) = (sort {$a <=> $b} @array)[0,-1];
您可以使用map执行此操作,而无需库:
my @array = (33, 32, 8, 100);
my ($max,$min)=(-1e99,1e99); # Initialize to values outside anything in your list
map {$max=$_ if ($_>$max); $min=$_ if($_<$min);} @array;
print "max=$max, min=$min\n";
my@array=(33,32,8100);
我的($max,$min)=(-1e99,1e99);#初始化为列表中任何外部的值
map{$max=$\uIf($\u>$max);$min=$\uIf($\u实际上我刚刚看到ikegami已经给出了上面的List::MoreUtils
答案。很抱歉重复了。这花费了一点时间来排序它可能已经遇到的介于min和max之间的值,在应该只需要O(N)的时候需要O(N log N)时间在Webwork内部编程,使用ApachePerl,没有模块,我没有“排序”。我该如何解决这个问题?@Echeban排序是每个perl的一个内部函数,不需要任何模块。请检查perldoc-f sort
或man perlfunc
。Webwork使用Apache perl并在评估PG文件时抛出此错误(eval 2211)第20行的操作掩码捕获的“排序”
在Webwork中,任何Perl(在其上下文中)无效的内容因此trapped@Echeban由于排序的比较代码可能存在潜在的不安全性,因此PG会抛出错误。请检查互联网上的错误,可能还会有更多错误。或者在此询问一个额外的错误特定问题-因为我不是PG专家,也不是网络工作专家,所以我不知道正确的方法。如果未收集结果,请使用f或
更清晰。如果最小值或最大值为零,则中断。应使用!defined($min)
代替!$min
,以测试$min
是否未定义(对于couse的$max
也一样)。
my ($min,$max) = (sort {$a cmp $b} @array)[0,-1];
my @array = (33, 32, 8, 100);
my ($max,$min)=(-1e99,1e99); # Initialize to values outside anything in your list
map {$max=$_ if ($_>$max); $min=$_ if($_<$min);} @array;
print "max=$max, min=$min\n";