多数元素未能关闭周期

时间:2016-03-13 19:02:20

标签: perl

我试图找出为什么这会继续印刷"多数元素"每个周期的候选人。

我一直在努力工作的代码是一个多数元素搜索(找到一个重复超过列表长度一半的元素)。

我无法分离查找候选项和针对数组进行测试的过程,因为我的输入是一个具有不确定数量的数组的文本文件。这是来自rosalind.info的练习,每次尝试解决时都会有不同的输入。

输入的一个例子是

-5 5 5 5 5 5 5 5 -8 7 7 7 1 7 3 7 -7 1 6 5 10 100 1000 1 -5 1 6 7 1 1 10 1 

这是我到目前为止所写的内容。

foreach my $currentrow (@lists) {

    my @row = ();
    @row = split( /\s/, $currentrow );

    my $length = $#row;
    my $count  = 0;
    my $i      = 0;

    for $i ( 0 .. $length - 1 ) {

        if ( $count == 0 ) {
            $candidate = $row[$i];
            $count++;
        }

        if ( ( $count > 0 ) and ( $i = $length - 1 ) ) {

            my $counter2 = 0;

            for my $j ( 0 .. $length - 1 ) {
                if ( $row[$j] == $candidate ) {
                    $counter2++;
                }
            }

            if ( $counter2 <= ( $#row / 2 ) and ( $i = $length - 1 ) ) {
                $candidate = -1;
                print $candidate, " ", $i, " ";
            }

            if ( $counter2 > ( $#row / 2 ) and ( $i = $length - 1 ) ) {
                print $candidate, " ", $i, " ";
            }

        }

        if ( $candidate == $row[$i] and $count > 0 ) {
            $count = $count + 1;
        }

        if ( $candidate != $row[$i] and $count > 0 ) {
            $count = $count - 1;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您有use strictuse warnings 'all'吗?

我认为您的问题可能是因为测试$i = $length - 1,这是一项任务,应该是$i == $length - 1

答案 1 :(得分:1)

要查找多数元素,我会使用哈希:

perl -nae '%h=(); $h{$_}+=2 for @F; $h{$_}>@F and print for keys %h; print "\n"'

每行输入都单独处理。每行输出都匹配一行输入并显示其多数元素,如果没有这样的元素则为空。

编辑:现在解决方案使用autosplit(-a),它更短,不仅适用于数字。