perl - Perl 中的模式函数
问题描述
我需要在 Perl 中创建模式函数的帮助。我使用来自不同来源的帮助编写了一个代码,但每次值都不同。模式 - 数组中元素出现的最大频率
当前代码 -
@array = <STDIN>;
@sorted = sort { $a <=> $b } @array ;
for $i(@sorted)
{
$cnt =0;
for $j(@sorted)
{
if($i eq $j)
{
$cnt = $cnt + 1;
$data{$i}= $cnt;
}
}
}
@modes = sort { $data{$a} <=> $data{$b} } keys %data;
$mode = $modes[-1];
解决方案
清理了缩进并添加了use strict
and 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;
推荐阅读
- python - 在标头与 pycurl.HTTPAUTH_GSSNEGOTIATE 中请求/发送 Kerberos 令牌
- javascript - ajax 发布请求 - 跨域读取阻塞 (CORB) 阻止跨域响应 CORS
- wordpress - 我网站的输入字段在 iphone、ipad 和 mac 上变为白色
- python - 在 Python 中不显示输入
- python - 从 Flightradar24 抓取数据
- visual-studio-code - Is there a way to save all files, commit and upload in one command in Visual Studio Code
- google-compute-engine - GCE 实例停止工作 1 小时
- c++ - 'const' 关键字是如何工作的?
- java - Javax 持久性在生产级别将 IDENTITY 更改为 SEQUENCE
- python-2.x - 理解 Python 2.x 中的深拷贝和浅拷贝