1

例:

char test1[] = "               ";
char test2[] = "   hello  z";
char test3[] = "hello world   ";
char test4[] = "x y z ";

結果:

"               "
"   olleh  z"
"olleh dlrow   "
"x y z "

問題:

文字列内のすべてのワールドを反転し、スペースを無視します。

以下は私のコードです。基本的な考え方は、単語を見つけるときに文字列をスキャンし、それを逆にすることです。アルゴリズムの複雑さは O(n) です。n は文字列の長さです。

どうやって確認するの?より良い解決策はありますか?

void reverse_word(char* s, char* e)
{
    while (s < e)
    {
        char tmp = *s;
        *s = *e;
        *e = tmp;
        ++s;
        --e;
    }
}

char* word_start_index(char* p)
{
    while ((*p != '\0') && (*p == ' '))
    {
        ++p;
    }

    if (*p == '\0')
        return NULL;
    else
        return p;
}

char* word_end_index(char* p)
{
    while ((*p != '\0') && (*p != ' '))
    {
        ++p;
    }

    return p-1;
}

void reverse_string(char* s)
{
    char* s_w = NULL;
    char* e_w = NULL;
    char* runner = s;

    while (*runner != '\0')
    {
        char* cur_word_s = word_start_index(runner);
        if (cur_word_s == NULL)
            break;
        char* cur_word_e = word_end_index(cur_word_s);
        reverse_word(cur_word_s, cur_word_e);
        runner = cur_word_e+1;
    }
}
4

5 に答える 5

4

あなたのコードは正しいようですが、単純な C です。C++ では、同じアプローチを使用すると、次のようになります。

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <cctype>

int main()
{
    std::string str = "    cat cow dog wolf     lobster";
    std::string result;
    auto it = str.begin();

    while (it != str.end()) {

        while (it != str.end() && isspace(*it)) {
            result += *it;
            ++it;
        }

        auto begin = it;
        while (it != str.end() && !isspace(*it)) {
            ++it;
        }
        auto end = it;

        result.append(std::reverse_iterator<decltype(end)>(end),
                      std::reverse_iterator<decltype(begin)>(begin));

        // if you want to modify original string instead, just do this:
        std::reverse(begin, end);
    }

    std::cout << result <<'\n';
}
于 2012-10-14T05:40:01.370 に答える
0
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    char str[100],a[10],s[100]=" ";
    int i,j;
    cout<<"enter a string";
    cin.getline(str,100);
    strcat(s,str);
    for(i=0;s[i]!='\0';i++)
    {
        if(s[i]==' '&&s[i+1]!=' '&&s[i+1]!='\0')
        {
            cout<<" ";
            if(i==0)cout<<"\b";
            j=i+1;
            while(s[j]!=' '&&s[j]!='\0')
            {
                j++;
            }
            j--;
            while(s[j]!=' ')
            {
                cout<<s[j];
                j--;
            }
        }
        else if(s[i]==' ')
        {
            cout<<" ";
            if(i==0)cout<<"\b";
        }
    }
    return 0;
}
于 2016-08-07T14:02:43.700 に答える