【问题标题】:How to find maximum and minimum value in an array of integers in Perl?如何在 Perl 的整数数组中找到最大值和最小值?
【发布时间】:2022-04-21 11:12:00
【问题描述】:

我有一个值 33、32、8、100 的数组。

如何在这个数组中找到最大值和最小值?

我需要包含任何特殊库吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    List::Utilminmax 都可以,

    use List::Util qw( min max );
    my $min = min @numbers;
    my $max = max @numbers;
    

    List::MoreUtilsminmax 在同时需要最小值和最大值时效率更高(因为它进行的比较更少)。

    use List::MoreUtils qw( minmax );
    my ($min, $max) = minmax @numbers;
    

    List::Util 是核心的一部分,但 List::MoreUtils 不是。

    【讨论】:

      【解决方案2】:

      没有模块:

      #!/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";
      

      【讨论】:

      • 这花费了一些时间来排序它可能已经遇到的最小值和最大值之间的值,花费 O(N log N) 时间,而它应该只花费 O(N) 时间。
      • 在 Webwork 中编程,使用 Apache Perl,没有模块我没有“排序”。我该如何解决这个问题?
      • @Echeban sort 是每个 perl 的内部函数,不需要个模块。检查perldoc -f sortman perlfunc
      • Webwork 使用 Apache Perl 并抛出此错误 ERRORS from evaluating PG file: 'sort' trapped by operation mask at line 20 of (eval 2211) 在 Webwork 中,任何(在其上下文中)无效的 Perl 都会被捕获
      • @Echeban 因为排序的比较代码可能不安全,所以 PG 会抛出错误。检查this thread,可能更多在互联网上。或者在这里问一个额外的和错误相关的问题——因为我不是 PG 专家,也不是 Webwork 专家,所以我不知道正确的方法。
      【解决方案3】:

      您可以使用List::Util 轻松完成此操作,例如。

      use List::Util qw(min max);
      my @arr = (33, 32, 8, 100);
      print min(@arr)," ", max(@arr), "\n";
      

      【讨论】:

        【解决方案4】:

        提供的解决方案很好,但如果你想自己实现它非常简单:

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

        【讨论】:

        • 如果最小值或最大值为零则中断。应该使用!defined($min) 代替!$min 来测试$min 是否未定义(当然$max 也是如此)。
        【解决方案5】:

        对于数字:

            my ($min,$max) = (sort {$a <=> $b} @array)[0,-1];
        

        对于字符串:

            my ($min,$max) = (sort {$a cmp $b} @array)[0,-1];
        

        【讨论】:

          【解决方案6】:

          您可以使用 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";
          

          【讨论】:

          • 当没有收集到结果时使用for更清晰。
          【解决方案7】:

          您应该使用自 v5.7.3 以来随 Perl 发行版一起发布的 List::Util,因此可能不需要安装。

          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
          

          【讨论】:

            【解决方案8】:

            当然,如果你同时想要一个列表的最大值和最小值,那么同时获取两者更有效;它只需要对每 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;
            

            【讨论】:

            • 其实我刚刚看到ikegami已经在上面给出了List::MoreUtils的答案。很抱歉被骗了。
            【解决方案9】:

            我认为List::Util 是您正在寻找的。​​p>

            【讨论】:

              【解决方案10】:

              您可以使用Statistics::Lite 计算最小值、最大值等

              【讨论】:

                【解决方案11】:

                使用List::Util module,无论如何建议熟悉它,就像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
                

                【讨论】:

                  【解决方案12】:

                  List::Util 具有“max”和“min”函数,您可以使用它们直接找到给定数字列表的最大值和最小值。检查你是否可以使用它。您也可以对数组进行排序,然后确定最高和最低的数字

                  【讨论】:

                    【解决方案13】:

                    这已经很晚了,但这是我在没有任何模块的情况下做到的。

                    sub min {
                        my $min = shift;
                        foreach (@_) {
                            $min = $_ if $_ < $min;
                        }
                        return $min;
                    }
                    
                    sub max {
                        my $max = shift;
                        foreach (@_) {
                            $max = $_ if $_ > $max;
                        }
                        return $max;
                    }
                    

                    【讨论】:

                      猜你喜欢
                      • 2018-03-14
                      • 2021-02-10
                      • 2018-07-04
                      • 2017-01-10
                      • 2019-08-21
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-05-03
                      相关资源
                      最近更新 更多