使用perl查找数组中的值的算法 - 绝对采访问题

时间:2017-01-27 11:05:09

标签: algorithm perl

我被要求执行perl程序以在数组中查找值(来自用户输入)。如果匹配"它确定"。如果不匹配,则检查索引[0]中的值到索引[1] ...索引[n]。那么如果值与两个元素之间匹配,那么报告这些元素附近可能是索引[0]或索引[1]。

让你解释一下。

给定数组:10 15 20 25 30; 从用户获取值:14(例如)

因此14匹配了两个元素10(array [0]) - 15(array [1])

  

最终检查点不要使用多个for循环,也不要使用while循环。您需要检查一个for循环和许多if条件。

我得到的输出是我在这里做的:

use strict;
use warnings;

my @arr1 = qw(10 15 20 25 30);
my $in = <STDIN>;
chomp($in);

if(grep /$in/, @arr1)
{  } #print "S: $in\n";  }
else
{
    for(my $i=0; $i<scalar(@arr1); $i++)
    {
        my $j = $i + 1;
        if($in > $arr1[$i] && $in < $arr1[$j])
        {
            #print "SN: $arr1[$i]\t$arr1[$j]\n";
            my ($inc, $dec) = "0";

            my $chk1 = $arr1[$i] + 1;
            AGAIN1:
            if($in == $chk1)
            { }
            else
            {  $chk1++; $inc++; goto AGAIN1;  }

            my $chk2 = $arr1[$j] - 1;
            AGAIN2:
            if($in == $chk2){ }
            else
            {  $chk2--;  $dec++; goto AGAIN2;  }
            if($inc > $dec)
            {  print "Matched value nearest to $arr1[$j]\n";  }
            elsif($inc < $dec)
            {  print "Matched value nearest to $arr1[$i]\n";  }
        }
    }
}

但我的问题是算法中有哪种方法?因此,如果有人可以帮助这个,我们将不胜感激。

提前致谢。

2 个答案:

答案 0 :(得分:3)

你似乎决心尽可能地让它变得复杂: - )

您的说明书并不完全清楚,但我认为这样做符合您的要求:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

my @array = qw[10 15 20 25 30];

chomp(my $in = <STDIN>);

if ($in < $array[0]) {
  say "$in is less than first element in the array";
  exit;
}

if ($in > $array[-1]) {
  say "$in is greater than last element in the array";
  exit;
}

for (0 .. $#array) {
  if ($in == $array[$_]) {
    say "$in is in the array";
    exit;
  }

  if ($in < $array[$_]) {
    if ($in - $array[$_ - 1] < $array[$_] - $in) {
      say "$in is closest to $array[$_ - 1]";
    } else {
      say "$in is closest to $array[$_]";
    }
    exit;
  }
}

say "Shouldn't get here!";

答案 1 :(得分:2)

使用核心模块List::Util和内置any中的帮助函数reduceabs

#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw/reduce any/;

my @arr1 = qw(10 15 20 25 30);

chomp(my $in = <STDIN>);

if (any {$in == $_} @arr1) {
    print "$in is in the array\n";  
}
else {
    my $i = reduce { abs($in - $arr1[$a]) > abs($in - $arr1[$b]) ? $b : $a} 0 .. $#arr1;
    print "$in is closest to $arr1[$i]\n";  
}