Tôi đang cố gắng tìm kiếm chuỗi số trong một mảng các số nguyên. Ví dụ, nếu mảng bao gồm các số 1,2,3,10,12,14
, nó có thể được tóm tắt đểPerl - trích xuất hàng loạt các số có bù từ mảng
1-3 với bù 1,
10-14 với bù 2
Dưới đây mã của tôi, nơi tôi vòng qua mảng từ phần tử thứ hai, theo dõi bù đắp giữa các phần tử mảng liên tục và tạo ra một mới 'loạt' nếu những thay đổi offset:
use strict;
use warnings;
my @numbers = (1,2,3,10,12,14); #array to extract series from
my $last_diff;
my $start = $numbers[0];
my $end;
my @all_series; #array will hold all information on series
for my $i (1..($#numbers+1)){
my $diff;
if ($i <($#numbers+1)){
$diff = $numbers[$i] - $numbers[$i-1];
}
if (!$diff || ($last_diff && ($last_diff != $diff))) {
$end = $numbers[$i-1];
my $series = { 'start'=> $start,
'end' => $end,
'offset'=> $start == $end ? 1 : $last_diff,
};
push @all_series, $series;
$start = $numbers[$i];
}
$last_diff = $diff;
}
use Data::Dumper;
print Dumper(@all_series);
Output trông như sau:
$VAR1 = {
'offset' => 1,
'end' => 3,
'start' => 1
};
$VAR2 = {
'offset' => 1,
'end' => 10,
'start' => 10
};
$VAR3 = {
'offset' => 2,
'end' => 14,
'start' => 12
};
Đây không phải là kết quả mong muốn, vì hai chuỗi cuối cùng có thể được tóm tắt thành một (10 đến 14, bù trừ 2 thay vì hai chuỗi).
Lỗ hổng trong thuật toán độc lập với perl, tuy nhiên, có thể ai đó có thể cho tôi gợi ý về cách tiếp cận tốt nhất, có thể tồn tại một số thủ thuật cụ thể cho điều này.
Trong ứng dụng của tôi, tất cả các số nguyên trong mảng nằm trong thứ tự tăng dần và số trùng lặp không tồn tại.
CHỈNH SỬA Nếu số đơn lẻ xảy ra không thể gán cho mức nghiêm trọng, chúng phải là chuỗi có độ dài một.
Những con số hơn có thể được tóm tắt để loạt, thì càng tốt (Tôi muốn giảm thiểu số lượng hàng loạt!)
đặc điểm kỹ thuật của bạn vẫn mơ hồ. Lấy '1 2 3 5 7': 3 nên đi đâu? Ngoài ra, đối với '1 2 3 10 12 20 21 22', bạn có muốn một chuỗi' 10 12', hoặc tạo thành 2 chuỗi singleton không? – choroba
Tôi đã không nghĩ về điều đó. Đối với trường hợp đầu tiên: Trong ứng dụng của tôi nó không quan trọng cho dù ba là một phần nếu thứ nhất hoặc thứ hai trình tự. Đối với trường hợp sau: '10 12' phải là một chuỗi. – user1981275