我有以下数组
@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/