1

数字の文字列があります。たとえば、「234615」と言います。次に、最初の最下位桁と2番目に低い桁の間で桁を反転する必要があります。

上記の文字列から、最初の下位桁は「1」で、2番目に低い桁は「2」です。下から2番目の桁と下から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) {

    }
}

上記のコードは、最初の最下位桁と2番目に低い桁を見つけることができます。しかし、逆の部分についてはよくわかりません。

誰かがこれで私を助けることができますか?

前もって感謝します !!

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。このワンライナーの完全なコードは次のとおりです。

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;

ご覧のとおり、これは指定された順序(2 ... 1など)に依存し$n1$n2表示されます。これはもちろん逆にすることもできますが、ハードコーディングされています。柔軟性が必要な場合、たとえば1...2または2...1の場合、より複雑になります。

あなたはこのようなことをすることができます:

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

分割の代わりに正規表現を使用して数値を抽出する利点は、入力に数字以外の数字が含まれるリスクがないことです。逆の手順は、文字列全体を照合し、置換(オプション)内の評価内23461の関数を使用して文字列を逆にすることによって行われます。並べ替えはデフォルトの並べ替えであり、1桁の数字を処理するときに機能します。reverse()/e

于 2012-10-28T18:14:30.853 に答える
1

以下のプログラムは、文字列内の数字が2回以上出現しない限り、必要な処理を実行します。最も低い値のいずれかが複数回発生する場合は、どちらが逆にする必要のあるサブストリングを許可するかを定義する必要があります。

@sortedそれはあなた自身のプログラムがするのと同じように、数字のソートされたリストをに入れることから始まります。次に、これらの数字の最初の2つを取得し、withを使用mapindexてそれらを文字列へのオフセットのペアに変換し、最初の数字が最初になるように並べ替えてから、置換を行います。

2回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 に答える