0

みなさん、こんにちは。次のように文字列を操作する関数に取り組んでいます。

「abc」->「cab」

"abcd"-> "dacb"

"abcdef"-> "faebdc"

「divergenta」->「adtinveerg」

... 等々。

これは私がこれまでに思いついたコードです。私はそれが仕事をしていると思いますが、コードとソリューションはちょっと醜いと思います、そしてそれが失敗の証拠であるかどうか、そしてそれが与えられたすべてのケースで正しく機能しているかどうかはわかりません。このコードに関する入力や、この関数の記述方法に関する例をいただければ幸いです。私は非常にn00bなので、あまり頑張らないください。

string transformer(string input) {

string temp;
int n = 0;
int m = (input.length() -1);

for( int i = 0; i < input.length(); i++) {

    temp += input[m];

    if (input[m] == input[n]) {
        break;
    }

    else {
        temp += input[n];
    }

    n += 1;
    m -= 1;

    if ( temp.length() == input.length() ) {
        break;
    }
}
return temp; }
4

6 に答える 6

2

あなたには 3 つの問題があります。

「アッバ」で試してみてください。結果が望むものではない場合、次の条件が適用されます。

if (input[m] == input[n]) {
break;
}

は単純に間違っています。

他の条件を見てください:

if ( temp.length() == input.length() ) {
  break;
}

一度に 2 つの文字を に追加していtempます。input長さが奇数の場合はどうなりますか?

それが正しく機能するとします。ループを考えてみましょう:

for( int i = 0; i < input.length(); i++) {

...

  if ( temp.length() == input.length() ) {
    break;
  }
}

そのループは、ステートメントで終了することはありません。forこのようにすることもできます:

while( temp.length() < input.length() ) {
...
}

すべてが正しく機能したら、イテレータを調べる必要があります。

于 2012-07-11T16:09:30.723 に答える
1

この関数は、2つのインデックスが互いに出会うか、通過するまで、2つのインデックスを中心に向かって歩きます。最後のifブロックは、奇数の長さの入力文字列の場合を処理します。ideone.comのすべてのテストケースで機能します

std::string transformer(const std::string& input)
{
    std::string temp;
    int i = 0;
    int j = input.length() - 1;

    while (i < j) {
        temp += input[j--];
        temp += input[i++];
    }
    if (i == j) {
        temp += input[i];
    }
    return temp;
}
于 2012-07-11T16:27:26.953 に答える
1
std::string transformer(const std::string& input) {

    std::string res(input.length(), '0');

    for (int i = 0; i < input.length(); ++i) {
        res[i] = input[ i % 2 == 0 ? input.length() - (i/2) - 1 : (i/2) ];
    }

    return res;
}
于 2012-07-11T16:16:39.480 に答える
0

これを行うには、インデックスの代わりにポインターを使用します。

したがって、エッジを読み取るポインターがあり、反復ごとにそれらを交換し続けます。

それはまたそれをより速くします。

これでうまくいくと思いますが、const char ポインターの配列を作成する方法を思い出せません。誰かがそのステップで私を助けることができますか?

string transformer(string input) {

     std::string temp;

     const char *front, *back;

     for (*front = input.c_str(), *back = front + input.length() - 1; front < back ; front++, back--) {
        temp += *back;
        temp += *front;
     }

     if (front == back)
        temp += *front;


     return temp;

}

(@Blastfurnace と同じ方法を使用しますが、不要なインデックスをスキップします。)

于 2012-07-11T16:29:04.220 に答える
0

残念ながらif (input[m] == input[n])、最初と最後の文字が同じ場合、最初の文字が処理されるとすぐに終了します。

于 2012-07-11T16:08:37.643 に答える
0

私はこれを行うstd::string::iteratorstd::string::reverse_iterator

auto it = input.begin();
auto rit = input.rbegin();
std::string temp;

for (size_t i = 0; i < input.length()/2; ++i) {
    temp += *rit++;
    temp += *it++;
}

空で奇数の長さの入力を処理するロジックは、ユーザーが行う必要がありますが、それほど難しくはありません。(長さ 1 の入力も特殊なケースです)

于 2012-07-11T16:17:17.903 に答える