带领带/抽奖的perl排名数字

时间:2015-02-23 15:37:42

标签: algorithm perl sorting hash integer

我有一个整数数组,但这不是1,2,3,4,5等的典型排名。如果整数具有相同的值,则排名也是相同的值。例1,2,2,4,5。但是我们需要相应地填补排名。因此,跳过排名3,因为有两个2。

1,2,3,3,5而不是1,2,3,3,4

整数数组可以是几千个,因此一个有效的算法将是理想的。如果它可以用perl编写为一个可以输入的函数,那就最好了。

整数数组= 1000,2000,3000,3000,3500

会得到结果= 1,2,3,3,5

另一个例子

整数= 100,200,200,200,300,400,500,500,1000,2000

排名= 1,2,2,2,5,6,7,7,9,10

2 个答案:

答案 0 :(得分:1)

您可以使用哈希来记住@integers数组中重复值的位置,

use strict;
use warnings;

my @integers = sort {$a <=> $b} (100,200,200,200,300,400,500,500,1000,2000);

my %seen;
my @rank = map { $seen{$integers[$_]} //= $_+1 } 0 .. $#integers;

# same as
# my @rank = map { $seen{$integers[$_]} //= $_+1; $seen{$integers[$_]} } 0 .. $#integers;

use Data::Dumper; print Dumper \@rank;

输出

$VAR1 = [
      1,
      2,
      2,
      2,
      5,
      6,
      7,
      7,
      9,
      10
    ];

答案 1 :(得分:0)

这个怎么样:

use strict;

my @test = (100,200,200,200,300,400,500,500,1000,2000);
my @sorted = sort {$a <=> $b} @test;
my $rank = 1;
my @ranks;
foreach my $count (0..$#sorted) {
    $rank = $count + 1 if ($count > 0 && $sorted[$count] != $sorted[$count - 1]);
    push @ranks, $rank;
}

print join ",", @ranks;