3

我是 Perl 的新手,我在 Perl 中设计某个函数时遇到了麻烦。

该函数应该找到并返回所有增加和减少的条带。这意味着什么?如果两个位置是相邻数字,则它们是邻居。即(2,3)或(8,7)。增加的地带是增加的邻居地带。即(3,4,5,6)。递减带的定义类似。在每个数组的开头添加一个 0,在末尾添加数组的长度+1。没有邻居的单个数字正在减少。0 和 n+1 正在增加。

所以如果我有数组 (0,3,4,5,9,8,6,2,1,7,10) 我应该得到以下结果: 增加条是:(3,4,5) (10) (0) 递减条是:(9,8), (6), (2,1) (7)

我试图将问题减少到只得到所有递减条,但据我所知:http: //pastebin.com/yStbgNme

代码在这里:

sub getIncs{
    my @$bar = shift;
    my %incs;
    my $inccount = 0;
    my $i=0;
    while($i<@bar-1){
        for($j=$i; 1; $j++;){
            if($bar[$j] == $bar[$j+1]+1){
                $incs{$inccount} = ($i,$j);
            } else {
                $inccount++;
                last;
            }
        }
    }

//edit1:我找到了一个包含上述函数 getStrips() 的 Python 程序,但我的 Python 充其量只是零星的。http://www.csbio.unc.edu/mcmillan/Media/breakpointReversalSort.txt

//edit2: 每个数字恰好是数组中的一个时间所以不能有重叠。

4

1 回答 1

2
use strict;
my @s = (0,3,4,5,9,8,6,2,1,7,10);
my $i = 0;
my $j = 0; #size of @s
my $inc = "Increasing: ";
my $dec = "Decreasing: ";

# Prepend the beginning with 0, if necessary
if($s[0] != 0 || @s == 0 ) { unshift @s, 0; }
$j = @s;

foreach(@s) {
  # Increasing
  if( ($s[$i] == 0) || ($i == $j-1) || ($s[$i+1] - $s[$i]) == 1 || ($s[$i] - $s[$i-1] == 1)) {
    if($s[$i] - $s[$i-1] != 1) { $inc .= "("; }
    $inc .= $s[$i];    
    if($s[$i+1] - $s[$i] != 1) { $inc .= ")"; }
    if($s[$i+1] - $s[$i] == 1) { $inc .= ","; }
  }

  #Decreasing
  if( ($s[$i]-$s[$i-1] != 1) && ($s[$i+1] - $s[$i] != 1) && ($s[$i] != 0) && ($i != $j-1) ) {
    if($s[$i-1] - $s[$i] != 1) { $dec .= "("; }
    $dec .= $s[$i];
    if($s[$i] - $s[$i+1] != 1) { $dec .= ")"; }
    if($s[$i] - $s[$i+1] == 1) { $dec .= ","; }
  }
  $i++;
}

$inc =~ s/\)\(/\),\(/g;
$dec =~ s/\)\(/\),\(/g;
print "$inc\n";
print "$dec\n";

结果:

Increasing: (0),(3,4,5),(10)
Decreasing: (9,8),(6),(2,1),(7)
于 2012-05-19T20:23:32.930 回答