回 帖 发 新 帖 刷新版面

主题:求解单词反转

请大家注意看题,不是字符反转,也不是纯粹的单词反转。这两个问题,在网上一搜就一把答案。
我要的效果是输入为 "Hello world", result: "olleH dlrow"。
即单词位置不变,但,单词内部的字符反转了。
我当前的想法,是用3个变量来一前一后地逐个单词进行遍历处理,然后进行逐个单词的反转,但,我觉得这样实现,比较不理想。
所以,我发贴问问大家,有没有更好的解法。

回复列表 (共5个回复)

沙发

可否先用一个结构存储“hello world”,然后用一个指针指向这个结构,对此进行遍历,并对得到的数据进行入栈,取到空格时,跳去执行出栈,然后判断栈空则返回继续遍历,依此进行操作。
楼主觉得呢?

板凳

ls方法可行。
typedef struct _SOURCE_STR
{
    size_t nlen;
    char *str;
    struct _SOURCE_STR *next_str;
}SOURCE_STR, *PSOURCE_STR;
链表存储,遇到空格增加节点,遍历链表,每个节点做一次操作。



3 楼


只要用stringstream字符串流读取字符,每次输出一个单词到string,再将string翻转,最后来个sum就可以了,很简单

4 楼

赞成1楼的想法。 这个例子可以作为栈结构“后进先出”这一特性的典型讲解。

5 楼

2楼说的对,这个题很明显要用栈,不知道哪位大神能不增加很多空间,而且能利用很小的时间复杂度就出来就好了。

#include <cstdlib>
#include <iostream>

using namespace std;
#define maxsize 256
typedef struct
{
        char data[maxsize];
        int top;
}SeqStack;

void WordReverse(char* src,int len)
{
     SeqStack * s;
     s=(SeqStack*)malloc(sizeof(SeqStack));
     s->top=-1;
     int min=0;
     for(int i=0;i<len;)
     {
             if(s->top==maxsize-1)
             {
                      printf("over flow");
                      return;
              }
              s->top++;
              s->data[s->top]=src[i];
              i++;
              if(src[i]==' '||src[i]=='\0')
              {
                for(int j=min;j<i;j++)
                {
                    if(s->top==-1)
                       {
                           break;
                        }
                   src[j]=s->data[s->top] ;
                   s->top--; 
                }
                i++;
                min=i;
                continue;
              }
              
     }
     
                                 
}

int main()
{
    char input[]="hello   world   xiaoming";
    int n=strlen(input);
    WordReverse(input,n);
    printf("%s\n",input);
    system("PAUSE");
    return EXIT_SUCCESS;
}
谁能帮忙提高下。

我来回复

您尚未登录,请登录后再回复。点此登录或注册