查找序列号和子号

ssr*_*012 4 perl

我有一个像这样的数组:

 my @tests = qw(1-1 1-2 1-3 1-5 2-1 2-2 2-4 3-1 3-2 4-1 4-2 6-1 6-2);
Run Code Online (Sandbox Code Playgroud)

1我需要验证数字 ( ) 和子数字 ( )的序列,1-1子数字表示 -(连字符)之后,请考虑为。

预期输出:Missing numbers 1-4, 2-3, 5

我的代码如下;我哪里出错了?

my @tests = qw(1-1 1-2 1-3 1-5 2-1 2-2 2-4 3-1 3-2 4-1 4-2 6-1 6-2);

my %sub_numbers;

foreach my $test (@tests) {
    $sub_numbers{$test} = 1;  # Mark sub-number as present
}

my ($min, $max) = get_min_max_sub_numbers(\@tests);

my @missing_sub_numbers;

for my $i ($min..$max) {
    for my $j (1..5) {
    my $sub_number = "$i-$j";
    unless ($sub_numbers{$sub_number}) {
        push @missing_sub_numbers, $sub_number;
    }
    }
}

my @filtered_missing_sub_numbers;

foreach my $missing_sub_number (@missing_sub_numbers) {
    my ($number) = split('-', $missing_sub_number);
    my $previous_sub_number = ($number - 1) . "-" . substr($missing_sub_number, 2);
    my $next_sub_number = ($number + 1) . "-" . substr($missing_sub_number, 2);
    unless ($sub_numbers{$previous_sub_number} || $sub_numbers{$next_sub_number}) {
    push @filtered_missing_sub_numbers, $missing_sub_number;
    }
}

if (@filtered_missing_sub_numbers) {
    print "Missing sub-numbers: " . join(", ", @filtered_missing_sub_numbers) . "\n";
} else {
    print "No missing sub-numbers found.\n";
}

sub get_min_max_sub_numbers {
    my ($tests_ref) = @_;
    my ($min, $max) = (undef, undef);

    foreach my $test (@$tests_ref) {
    my ($num) = split('-', $test);
    $min = $num if !defined($min) || $num < $min;
    $max = $num if !defined($max) || $num > $max;
    }

    return ($min, $max);
}
Run Code Online (Sandbox Code Playgroud)

cho*_*oba 6

使用哈希来记住您见过的数字和数字元组。

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

use List::Util qw{ min max };

my @tests = qw(1-1 1-2 1-3 1-5 2-1 2-2 2-4 3-1 3-2 4-1 4-2 6-1 6-2);

my %seen;
for my $tuple (@tests) {
    my ($first, $second) = split /-/, $tuple;
    undef $seen{$first}{$second};
}
my $min = min(keys %seen);
my $max = max(keys %seen);

my @missing;
for my $i ($min .. $max) {
    if (exists $seen{$i}) {
        my $s_min = min(keys %{ $seen{$i} });
        my $s_max = max(keys %{ $seen{$i} });
        for my $j ($s_min .. $s_max) {
            push @missing, "$i-$j" unless exists $seen{$i}{$j};
        }
    } else {
        push @missing, $i;
    }
}

say join ', ', @missing;
Run Code Online (Sandbox Code Playgroud)

  • OP 中没有关于“子子编号”的内容。 (2认同)