1

これを解決するには?https://code.google.com/codejam/contest/351101/dashboard#s=p1 ?

出来上がったコードは以下ですが、文字列全体を反転させ、単語を反転させて完成という文字通りの論理を念頭に置いたコードだったので、文字列を1スペースまでしか反転できません。スペースが少し混乱していて、スペースの数を検出してそれに応じて行動するループを試みたときに失敗しました。助けてください!コード:

#include <iostream>
#include <string>

using namespace std;


int main()
{

    char revwrd[100];
    char revstr[100];
    string str;
    getline(cin, str);
    cout<<str;
    int sps[10];

    int len,y=0;
    len = str.length();
    cout<<"\n"<<"The Length of the string is:"<<len;
    for(int x=len-1;x>-1;x--)
    {
        revstr[x] = str[y];
        y++;

    }
    cout<<"\n"<<"The inverse of the string is:"<<"\n";
    for(int z = 0;z<len;z++)
    {
        cout<<revstr[z];
    }
    cout<<"\n";

    int no=0;
    int spaces=0;
    for(int a=0;a<len;a++)
    {
        if(revstr[a]== ' ')
        {
            sps[no]=a;
            no++;
            spaces++;
        }
    }

    int rinc=0;
    int spinc;
    cout<<"\n";
    spinc=sps[0];

    int spinc2 = sps[0]+1;
    int lend;
    for(rinc=0;rinc<sps[0]+1;rinc++)
    {

        revwrd[rinc] = revstr[spinc];
        spinc--;
    }


    for(lend=len;lend>sps[0];lend--)
    {
        revwrd[spinc2] = revstr[lend];
        spinc2++;
    }
    cout<<"Spaces in the string:"<<spaces<<"\n";
    cout<<"The words inversed are:"<<"\n";
    for(int inc=1;inc<len+1;inc++)
    {
        cout<<revwrd[inc];
    }

    return 0;
}
4

6 に答える 6

1

いくつかのループと if's:

// Reverse Words 
#include <iostream>
#include <string>

using namespace std;

int main() {
    int tc; cin >> tc; cin.get();
    for(int t = 0; t < tc; t++) {
        string s, k; getline(cin, s);   
        for(int i = (s.length()- 1); i >= 0; i--) {
            if(s[i] == ' ' || (i == 0)) {
                    if(i == 0) k += ' ';
                for(int j = i; j < s.length(); j++) {
                    k += s[j];
                    if(s[j+1] == ' ' ) break;
                }
            } 
        }
        cout << "Case #" << t + 1 << " " << k << endl;
    }   

    return 0;
}
于 2014-04-09T01:02:10.357 に答える
1

課題の条件は、単語間にスペースが 1 つだけあることと、スペースが行頭または行末に現れないことです 。各単語の間に単一のスペースを入れて出力を書く限り、問題ありません。

それを念頭に置いて、通常の形式の入力を使用して各単語を読み取ることができます。

std::string word;
...
while ( stream >> word )
  // do something with word

バッファサイズやスペースの検出などを心配する必要はありません。改行peek文字の検出について心配する必要はありませんが、次のメソッドを使用して簡単に行うことができます。

while ( stream >> word )
{
  // do something with word;
  if ( stream.peek() == '\n' )
    break;
}

上記のループstreamは、改行文字が表示されるまで、入力ストリームから個々の単語を読み取ります (おそらくもっと良い方法がありますが、うまくいきます)。

ここで、入力の各行を逆にするために、文字列を読み取りながらどこかに格納する必要があることは明らかです。最も簡単な方法は、それらをベクトルに格納することです。

std::vector< std::string > strings;
...
while ( stream >> word )
{
  strings.push_back( word );
  if ( stream.peek() == '\n' )
    break;
}

これで、行内のすべての文字列を含むベクトルが得られたので、それらを逆の順序で出力するだけです。逆反復子を使用して、ベクトルをウォークスルーできます。

std::vector< std::string >::reverse_iterator it;
for ( it = strings.rbegin(); it != strings.rend(); ++it )
{
  std::cout << *it << " ";
}
std::cout << std::endl;

このメソッドは、ベクター内の最後の要素rbegin()を指す反復子を返します。メソッドは、ベクトルの最初の要素のの要素を指す反復子を返します。ベクター内の次の項目を指すように反復子を進め、前に戻ります。イテレータが指す文字列を返します。もう少し難解で、テンプレート関数を使用できます。rend()++it*itcopy

std::copy( strings.rbegin(), 
           strings.rend(), 
           std::ostream_iterator<std::string>( std::cout, " " )
         );

その単一のメソッド呼び出しが上記のループを置き換えます。単一のスペース文字で区切られた に ostream_iterator文字列を書き込むnew を作成します。cout

この特定の演習の条件では、これで十分です。スペースを保持する必要がある場合、または句読点や大文字化を考慮する必要がある場合は、少し低レベルの処理を行う必要があります。

于 2013-04-17T16:27:09.667 に答える
0

これは複数のスペースを処理する可能性があります:

std::string ReverseSentence(std::string in)
{
   std::vector<string> words;
   std::string temp = "";
   bool isSpace = false;
   for(int i=0; in.size(); i++)
   {
      if(in[i]!=' ')
      {
         if(isSpace)
         {
            words.push_back(temp);
            temp = "";
            isSpace = false;
         }
         temp+=in[i];
      }
      else
      {
         if(!isSpace)
         {
            words.push_back(temp);
            temp = "";
            isSpace = true;
         }
         temp +=  " ";
      }
   }
   std::reverse(words.begin(),words.end());
   std::string out = "";
   for(int i=0; i<words.size(); i++)
   {
      out+=words[i];
   }
 return out;
}
于 2013-04-17T12:52:46.723 に答える
0

この方法に従うことができます:

ステップ1:入力配列のスペースをチェックして、インデックス番号を整数配列に格納します。

ステップ2:この整数配列を最後から繰り返します

step a : make a string by copying characters from this index to previous index .
      note : since for first element there is no previous element in that case you will   copy   from this index to end of the input string .  

step b : step a will give you a word from end of input string now add these word with a space to make your output string .  

これがお役に立てば幸いです。

于 2013-04-17T12:56:14.690 に答える
0

私は力ずくで行きました、そして私はひどくポインターを使いたかったのです!

  1. 文を得る
  2. すべての単語を検出し、コンテナに入れます。
  3. コンテナーを逆方向に読み取ります。

これです:

#include <iostream>
#include <string>
#include <vector>
int main()
{
char *s1 = new char[100];
std::cin.getline(s1, 100);

std::vector<std::string> container;
char* temp = new char[100];
char *p1, *p0;

p1 =p0 = s1;
int i;
do{
    if (*p1==' ' || *p1=='\0'){
        //std::cout<<p1-p0<<' ';
        for(i=0;i<p1-p0;++i) temp[i]=p0[i]; temp[i]='\0';
        p0 = p1+1;
        container.push_back(temp);
        std::cout<<temp;
    }
    p1++;
}while(*(p1-1)!='\0');

std::cout<<std::endl;
for(int i=container.size()-1;i>=0;i--) std::cout<<container[i]<<' ';

return 0;
}
于 2015-05-27T15:43:11.870 に答える
0

この問題は実際には再帰のために作られています:

void reverse()
{
    string str;
    cin >> str;
    if (cin.peek() != '\n' || cin.eof()) {
        str = " " + str;
        reverse();
    }
    cout << str;
}

int main(int argc, const char * argv[])
{
    int count = 0;
    cin >> count;
    for (int i = 0; i < count; i++) {
        cout << "Case #" << (i + 1) << ": ";
        reverse();
        cout << endl;
    }
    return 0;
}

そのため、単語ごとに読み取り、行またはファイルの終わりに達するまで、単語の前にスペースを 1 つ追加します。行の終わりに達すると、再帰はラップを解除し、読み取った文字列を逆の順序で出力します。

于 2013-05-10T15:47:11.990 に答える