2012-05-22 37 views
10

Tôi có một mảng có giá trị 33, 32, 8, 100.Làm thế nào để tìm giá trị lớn nhất và tối thiểu trong một mảng các số nguyên trong Perl?

Làm cách nào để tìm giá trị lớn nhất và tối thiểu trong mảng này?

Tôi có cần bao gồm bất kỳ thư viện đặc biệt nào không?

+4

là bài tập về nhà này? Bạn đã thử cái gì? –

+2

Điều gì về googling một chút? – jm666

+1

Bạn có thể có những câu hỏi đơn giản ở đây trên SO khi các câu trả lời được sắp xếp cuối cùng tốt hơn nhiều so với những gì bạn có thể tìm thấy bởi Googling. –

Trả lời

25

List::Util 's minmax cũng tốt,

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

Nhưng List::MoreUtils' s minmax là hiệu quả hơn khi bạn cần cả min và max (vì nó so sánh ít hơn).

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

Danh sách :: Util là một phần cốt lõi, nhưng Danh sách :: MoreUtils thì không.

0

Tôi nghĩ rằng List::Util là những gì bạn đang tìm kiếm.

19

Bạn có thể sử dụng List::Util để làm điều này một cách dễ dàng, ví dụ.

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

+1 vì câu trả lời này được hỗ trợ bởi mã tự giải thích. :) – verisimilitude

0

Sử dụng List::Util module, mà nó được khuyến khích để làm quen với dù sao, giống như 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 
0

List::Util có "tối đa" và "min" chức năng mà bạn có thể sử dụng để trực tiếp tìm tối đa và tối thiểu cho một danh sách các số. Kiểm tra xem bạn có thể sử dụng điều đó không. Bạn cũng có thể sắp xếp mảng và sau đó xác định số cao nhất và thấp nhất

1

Bạn nên sử dụng List::Util đã được phát hành với phân phối Perl vì v5.7.3 vì vậy có thể không cần cài đặt.

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; 

đầu ra

8 
100 
10

Các giải pháp được cung cấp là tốt, nhưng nếu bạn muốn thực hiện điều đó cho mình đó là khá đơn giản:

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

Nếu không có module:

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

Điều này chi tiêu một chút giá trị đặt hàng thời gian nằm giữa min & max mà nó có thể đã gặp phải, lấy thời gian O (N log N) khi nó chỉ mất thời gian O (N). – hepcat72

1

ofcourse, nếu bạn muốn cả giá trị tối đa và giá trị tối thiểu của danh sách cùng một lúc, thì việc tìm nạp cả hai cùng một lúc sẽ hiệu quả hơn; nó chỉ phải thực hiện 3 lần so sánh đơn đặt hàng cho mỗi 2 mục dữ liệu, chứ không phải là 4. Điều này có thể quan trọng nếu các tập dữ liệu đủ lớn.

List::Util không cung cấp chức năng minmax nhưng List::MoreUtils.

use strict; 
use warnings; 
use feature qw(say); 

use List::MoreUtils qw(minmax); 

my ($min, $max) = minmax @data; 

say $min; 
say $max; 
+0

Thực ra tôi vừa mới thấy ikegami đã đưa ra câu trả lời 'List :: MoreUtils' ở trên. Xin lỗi vì sự lừa đảo. – LeoNerd

1

Đối số:

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

Đối với chuỗi:

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

Bạn có thể sử dụng bản đồ để làm điều này mà không cần thư viện:

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"; 
Các vấn đề liên quan