【问题标题】:How can I test if a value is repeated in array?如何测试一个值是否在数组中重复?
【发布时间】:2017-07-02 04:12:21
【问题描述】:

我正在做一个以数字列表作为参数的子程序。我想做的是检查该列表中是否有重复值。如果有重复的数字,打印一条消息并停止程序。如果没有重复的数字,则继续执行。

例如:

if (there_is_number_repeated){
    print "There is a number repeated";}
else{
    run this code...}

我试图用该列表的值创建一个哈希,然后检查是否有值> 1

    use strict;
    use warnings;

sub name_subroutine{
    my (@numbers)=@_;
    my $n=scalar(@numbers);

    my %table=();

    foreach my $i(@numbers){
    if (exists $tabla{$i}){
        $tabla{$i}+=1;}
    else{
        $tabla{$i} = 1;
    }
my @values = values %tabla;
}
}

这里是我不知道继续的地方。有没有办法以业余的方式做到这一点?我是 Perl 的新手。

谢谢!

【问题讨论】:

  • 请注意你写了tabletabla。大概您试图将变量名称翻译成英文。下次,您不需要翻译它们,或者确保您的脚本在翻译后仍然表现相同。

标签: perl


【解决方案1】:

我会这样做:

my %uniq;
if ( grep ++$uniq{$_} > 1, @numbers ) {
     # some numbers are repeated
}

在您现有的代码中(有一些更正):

my %table=();

foreach my $i(@numbers){
    if (exists $table{$i}){
        $table{$i}+=1;}
    else{
        $table{$i} = 1;
    }
}
my @values = values %table;

你不需要检查存在;如果不存在,则执行 += 1++ 会将其设置为 1。而且您不想要值(这些只是找到每个数组值的次数的计数),您想要键,特别是值大于 1 的键:

my @repeated = grep $table{$_} > 1, keys %table;

【讨论】:

    【解决方案2】:
    my @arr = @_; 
    my $count = @arr;
    for(my $i=0;$i<$count;$i++)
    {
        my $num = $arr[$i];
        for(my $j=0; $j<$count,$j!=$i; $j++)
        {
            if($num == $arr[$j])
            {
               print "\n$num is repeated";
               last;
            }  
        }
    }  
    

    久经考验。干杯。

    【讨论】:

    • 你应该提到你的答案的时间复杂度 (O(n*n)),这比 ysth 的要多。 (但你的空间复杂度比他低)
    • 感谢先生的点评。我实际上是编码的新手。从现在开始会照顾它。
    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2021-07-07
    • 2010-11-06
    • 1970-01-01
    • 2011-10-29
    相关资源
    最近更新 更多