我有一串数字。比如说:“234615”。现在我应该在第一个最低位和第二个最低位之间翻转数字。
从上面的字符串开始,第一个最低位是“1”,第二个最低位是“2”。第一个最低位数和 第二个最低位是“346”。现在,这个“346”应该写成“643”。
希望我能清楚说明问题。
这是我试过的代码,
my $a = "234615";
my @g = split("", $a);
@g = sort(@g);
my $first = $g[0];
my $second = $g[1];
print "$first \t $second\n\n";
for(my $i = 0; $i < $#g; $i++) {
if ($g[$i] == $first) {
}
if ($g[$i] == $second) {
}
}
我上面的代码可以找到第一个最低位和第二个最低位。但我不确定反面部分。
有人可以帮助我吗?
提前致谢!!
答案 0 :(得分:2)
另一种方式:
my $a = "234615";
my @g=split("",$a);
@g=sort(@g);
my $first=$g[0]; my $second=$g[1];
my @ar = split(/($first|$second)/,$a);
$ar[2] = reverse($ar[2]);
print join("",@ar)."\n\n";
也会返回264315
在我更新后编辑:
use Data::Dumper;
my $a = "234615";
my @g=split("",$a);
@g=sort(@g);
my $first=$g[0]; my $second=$g[1];
my @ar = split(/($first|$second)/,$a);
my @result;
push(@result,
$ar[0],
$ar[1].$ar[2].$ar[3],
$ar[4]);
$result[1] = reverse($result[1]);
print join("",@result)."\n\n";
返回164325
答案 1 :(得分:2)
如果我理解你的问题,你可以这样做:
perl -lwe '$_ = 234615;
@a = /\pN/g;
my ($n1,$n2) = (sort @a)[0,1];
s/$n2.*?$n1/reverse $&/e;
print;'
产生输出164325
。该oneliner的完整代码是:
use strict;
use warnings;
$_ = shift; # first arg is the number
my @digits = /\pN/g; # extract digits
my($n1, $n2) = (sort @digits)[0, 1]; # take the two lowest
s/$n2.*?$n1/reverse $&/e; # reverse digits using /e
print;
正如您所看到的,它取决于$n1
和$n2
按指定顺序出现,例如2 ... 1.这当然可以逆转,但是硬编码。如果您需要它是灵活的,例如1 ... 2或2 ... 1,它变得更复杂。
你可以这样做:
if (/$n2.*?$n1/ { # if $n2 appears first
s/$n2.*?$n1/reverse $&/e;
else {
s/$n1.*?$n2/reverse $&/e;
}
使用正则表达式而不是拆分来提取数字的好处是,您不会冒险在输入中使用任何非数字。通过匹配整个字符串23461
并将其反转,使用替换(reverse()
选项内的评估内部的/e
函数来完成相反的过程。排序是默认排序,在处理单个数字时将起作用。
答案 2 :(得分:1)
只要字符串中的数字不会出现多次,下面的程序就可以满足您的需要。如果最低值中的任何一个出现多次,那么您需要定义哪个省略了必须反转的子字符串。
首先将排序的数字列表放入@sorted
,就像您自己的程序一样。然后它使用前两个数字,使用带有map
的{{1}}将它们转换为字符串中的一对偏移量,对它们进行排序,使得第一个最早是第一个,然后执行更换。
index
可以避免两次调用for
。它将所需的子字符串与substr
混淆,然后就地将其反转。
$_
<强>输出强>
use strict;
use warnings;
my $str = '234615';
my @sorted = sort split //, $str;
my @indices = sort { $a <=> $b } map { index $str, $_ } @sorted[0,1];
for (substr $str, $indices[0] + 1, $indices[1] - $indices[0] - 1) {
$_ = reverse $_;
}
print $str;
答案 3 :(得分:-1)
print "Enter the String to be reversed : ";
$name = <STDIN>;
chomp $name;
@array = split(undef,$name);
$len = length($name);
for($i=$len; $i>=0; $i--)
{
print "@array[$i]";
}