1

我有一串数字。比如说:“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) {

    }
}

我上面的代码可以找到第一个最低位和第二个最低位。但我不确定相反的部分。

有人可以帮助我吗?

提前致谢 !!

4

4 回答 4

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

于 2012-10-28T17:41:03.900 回答
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 OR 2 ... 1,它会变得更加复杂。

你可以这样做:

if (/$n2.*?$n1/ {                # if $n2 appears first
    s/$n2.*?$n1/reverse $&/e;
else {                          
    s/$n1.*?$n2/reverse $&/e;
}

使用正则表达式而不是拆分来提取数字的好处是您不会冒险在输入中包含任何非数字。反向过程是通过匹配整个字符串23461并反转它来完成的,使用替换(选项)reverse()内的评估内的函数。/e排序是默认排序,在处理单个数字时会起作用。

于 2012-10-28T18:14:30.853 回答
1

只要字符串中的数字永远不会出现多次,下面的程序就会满足您的需求。如果任何一个最低值多次出现,那么您需要定义它们中的哪一个分隔必须反转的子字符串。

它首先将排序的数字列表放入@sorted,就像您自己的程序一样。然后它获取这些数字中的前两位,使用mapwithindex将它们转换为字符串中的一对偏移量,对它们进行排序,使第一个是最早的,然后进行替换。

那里是为了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;

输出

264315
于 2012-10-28T17:35:48.157 回答
-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]";
      }
于 2013-06-13T10:43:47.093 回答