gpt4 book ai didi

perl - 集群化(组)字符串数组

转载 作者:行者123 更新时间:2023-12-01 06:21:00 25 4
gpt4 key购买 nike

我需要按照以下方式对字符串数组进行分组(合并附近的相同字符串)

Input          | Output
---------------+--------------------
[ | [
'a' | 'a (x3)',
'a' | 'b',
'a' | 'c (x2)'
'b' | 'd'
'c' | 'c'
'c' | 'x'
'd' | ]
'c' |
'x' |
] |
---------------+--------------------

怎么做?

这段代码是我写的

sub str_minus_multiplier {
my ( $str ) = @_;
$str =~ s/\(x(\d+)\)//;
return $str;
}

sub str_add_multiplier {
my ( $str, $num ) = @_;
$num = 1 if !defined $num;
if ( my $n = str_has_multiplier($str) ) {
$str = str_minus_multiplier($str);
my $new_m = $n+$num;
$str.= '(x'.$new_m.')';
} else {
$str.= ' (x2)';
}
return $str;
}

sub fold_list {
my ( @x ) = @_;
for my $i (0 .. $#x-1) {

my $j = 1;
while ( str_minus_multiplier($x[$i]) eq $x[$i+$j] ) {
$x[$i] = str_add_multiplier($x[$i]);
$j++;
}
splice(@x, $i+1, $j-1) if ( $j > 1 );
}
return @x;
}

但它没有按预期工作,fold_list() 的输出是

[
'a (x2)',
'a',
'b',
'c (x2)',
'd',
'c',
'x',
' (x2)'
];

我猜问题出在str_minus_multiplier($x[$i]) eq $x[$i+$j]比较中,拼接后比较中的一个值是undef。如何避免这种情况?

最佳答案

你可能把问题复杂化了。本质上,这是 run-length encoding 的变体。 .

想法是遍历列表并在每个字符处递增一个计数器以计算“运行”的长度,或者有多少后续字符等于当前字符。找到长度后,以适当的格式将其添加到结果中,并跳过您刚刚压缩在一起的所有元素。

use strict;
use warnings;
use Data::Dumper;

my @a = split //, "aaabccdcx";
my @rle;

for (my $i = 0; $i < @a;) {
my $j = 1;

while ($i + $j < @a && $a[$i+$j] eq $a[$i]) {
$j++;
}

push @rle, $a[$i] . ($j > 1 ? " (x$j)" : "");
$i += $j;
}

print Dumper \@rle;

输出:

$VAR1 = [
'a (x3)',
'b',
'c (x2)',
'd',
'c',
'x'
];

关于perl - 集群化(组)字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54239019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com