Очистив отступы и добавив use strict
и use warnings
, я получаю следующий код:
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my @array = <STDIN>;
my @sorted = sort { $a <=> $b } @array ;
my %data;
for my $i (@sorted) {
my $cnt = 0;
for my $j (@sorted) {
if ($i eq $j) {
$cnt = $cnt + 1;
$data{$i}= $cnt;
}
}
}
my @modes = sort { $data{$a} <=> $data{$b} } keys %data;
say "The mode is: $modes[-1]";
И, похоже, это работает правильно.Так что, возможно, вам нужно объяснить проблему чуть более подробно.
Обновление: Хорошо, поэтому я думаю, что теперь я понимаю вашу проблему - даже если вы действительно не сказали, чтоэто очень ясно.
Если для режима есть два потенциальных значения (то есть два числа, которые появляются одинаковое количество раз), то вам нужно наименьшее.И ваше текущее решение выбирает одно из потенциальных значений случайным образом.
Проблема заключается в следующей строке:
@modes = sort { $data{$a} <=> $data{$b} } keys %data;
Это сортирует хэш по числу раз, когда значения появляются.Но если несколько значений появляются одинаковое количество раз, они могут появляться в любом порядке - так что вы получите, казалось бы, случайное число из конца.
Решение состоит в том, чтобы добавить больше интеллекта к сортировке, чтобыв случае галстука сортировка ключа поменьше продолжается.Это будет выглядеть так:
my @modes = sort {
$data{$a} <=> $data{$b}
or
$b <=> $a
} keys %data;