arrays - 检查数组元素是否连续

标签 arrays perl

我有以下数组

@array = qw(1 2 3 3A 3B 4 6)

我想检查数组中的元素是否连续

我有不同的连续场景。

情况1:1,2,3,4被认为是连续的;

情况2: 14A,14B,14C,14D 应被视为连续;

情况 3: 1,2,3,3A,3B,4,5 也应被视为连续。

我检查连续性的窗口是两个,每当存在不连续性时,我希望在其位置返回一个星号(*),即考虑@array,它应该在 4 和 6 之间返回 *,因为 5丢失,因此返回 1 2 3 3A 3B 4 * 6。

虽然当我的数组元素与 case 1 类似时,以下代码有效,但由于 @array 的元素与 case 3 中的元素相同,所以我的条件不起作用,我寻求一个解决这个问题的有效方法,即涵盖所有三种情况

for ($i=0;$i<=$#array;$i+=2)
{
    if($array[$i+1] == $array[$i]+1)
    {
        print $array[$i],$array[$i+1];
    }
    else
    {
        print $array[$i],"*";
    }
}

要考虑的事情:

  • 数组元素始终为数字(例如 1,2,3)和数字与字母连接(例如 2A)。
  • 需要多个星号来表示多个缺失元素,即星号的数量应与缺失元素的数量相匹配。

最佳答案

您不需要很多东西来解决问题:

  • 将字母与数字分开,例如使用正则表达式,
  • 使用ord比较字母
  • 然后,编写正确的测试。

例如,这段代码应该可以完成这项工作:

use warnings;
use strict;
my @array = qw(1 2 3 3A 3B 4 6);

$\ = ' '; # adds a space after each print
for my $i (0 .. $#array-1) {
    print $array[$i];
    my ($nb1, $letter1) = $array[$i] =~ /(\d+)([A-Z]*)/;
    my ($nb2, $letter2) = $array[$i+1] =~ /(\d+)([A-Z]*)/;
    if ($nb2 == $nb1 + 1) {
        next;
    } elsif ($nb2 > $nb1 + 1) {
        print '*' for $nb1 .. $nb2 - 2;
    } else {
        if (! $letter1) {
            unless ($letter2 && $letter2 eq 'A') {
                print '*';
            }
        } else {
            unless (ord($letter2) == ord($letter1) + 1) {
                print '*' for ord($letter1) .. ord($letter2) - 2;
            }
        }
    }
}
print $array[-1]

将打印:
1 2 3 3A 3B 4 * 6

关于arrays - 检查数组元素是否连续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37991903/

相关文章:

javascript - 从javascript中的数组数组中获取唯一的日期时间字符串值

Perl 脚本查找 Unix 上所有无主文件和目录 - 如何进一步优化?

perl - 如何在不重新启动 Perl 调试器中的脚本的情况下重新运行子例程?

perl - 迭代地在 Perl 中的匹配行之后抓取多行?

javascript - 数组键和填充

javascript - 如何调用/编辑在数组中找到的具有类名的所有 html 元素?

arrays - C程序语法

php - 将越来越多的数字添加到 php 数组中(这样我以后就可以用 php echo 调用它)

xml - 如何在Perl的LibXML findnodes中使用RegEx

windows - 如何检测 Windows XP 机器上是否播放任何声音