您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

2. 反转单词的两种解决方案

2025/10/17 1:35:33发布20次查看
编写一个函数,反转一个字符串中单词的顺序。例如,函数应该将字符串life is better and better.转换成better. and better is life。假定所有的单词都是以空格分隔的,标点也作为字母一样处理。 1. 通用的解决方法 通用解决方案的工作原理如下: 首先,需要
    编写一个函数,反转一个字符串中单词的顺序。例如,函数应该将字符串“life is better and better.”转换成“better. and better is life”。假定所有的单词都是以空格分隔的,标点也作为字母一样处理。
1. 通用的解决方法
    通用解决方案的工作原理如下:
    首先,需要分配适当大小的临时缓冲区。然后,需要进行扫描循环,从字符串的最后一个字符开始。当发现非单词字符时,可以将它直接写到缓冲区中去。但是,当发现单词字符时,不能立即将它写入临时缓冲区。因为是在反向扫描这个字符串,遇到的第一个字符,正好是这个单词的最后一个字符,所以如果按发现字符的顺序复制,会使每个单词中的字符发生反转。所以,需要继续扫描,直到找到这个单词的第一个字符,再将这个单词的每个字符以正确的、不反转的顺序进行复制。当复制一个单词的字符时,需要确定这个单词的结尾,这样才能知道何时停止复制。可以通过检查每个字符是否是单词字符来实现这一点,但因为已经知道了这个单词最后一个字符的位置,更好的方法是进行复制直至到达这个位置。
    程序代码如下:
    #include stdafx.h
    #include
    #include
    #include
bool reversewords(char str[])
    {
        char *buffer;
        int tokenreadpos, wordreadpos, wordend, writepos = 0;
// position of the last character is length - 1
        tokenreadpos = strlen(str) - 1;
        buffer = (char*)malloc(tokenreadpos + 2);
if(!buffer)
            return false; // reversewords failed
while(tokenreadpos >= 0)
        {
            if(str[tokenreadpos] == ' ') // non-word characters
            {
                // write character
                buffer[writepos++] = str[tokenreadpos--];
            }
            else // word character
            {
                // store position of end of word
                wordend = tokenreadpos;
// scan to next non-word character
                while(tokenreadpos >= 0 && str[tokenreadpos] != ' ')
                    tokenreadpos--;
// tokenreadpos went past the start of the word
                wordreadpos = tokenreadpos + 1;
// copy the characters of the word
                while(wordreadpos                 {
                    buffer[writepos++] = str[wordreadpos++];
                }
            }
        }
// null terminate buffer and copy over str
        buffer[writepos] = '/0';
strcpy(str, buffer);
free(buffer);
return true; // reversewords successful
    }
int main()
    {
         char str[] = life is better and better!;
         cout          reversewords(str);
         cout
         return 0;
    }
程序的运行结果如下图所示:
2. 专用的解决方法:
    专用解决方法的原理如下:
    首先,将整个字符串进行反转。然后,对反转后的每个单词进行反转。与通用解决方法相比,专用解决方法的好处是不需要缓冲区。 
    程序代码如下:
    #include stdafx.h
    #include
    #include
void reversestring(char str[], int start, int end)
    {
        char temp;
        while(end > start)
        {
            // exchange characters
            temp = str[start];
            str[start] = str[end];
            str[end] = temp;
// move indices towards middle
            start++; end--;
         }
     }
void reversewords(char str[])
     {
         int start = 0, end = 0, length;
length = strlen(str);
// reverse entire string
         reversestring(str, start, length - 1);
while(end          {
             if(str[end] != ' ') // skip non-word characters
             {
                 // save positions of beginning of word
                 start = end;
// scan to next non-word character
                 while(end                      end++;
                 // back up to end of word
                 end--;
// reverse word
                 reversestring(str, start, end);
              }
              end++; // advance to next token
         }
    }
int main()
    {
        char str[] = life is better and better!;
        cout         reversewords(str);
        cout
        return 0;
     }
程序的执行结果如下:
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product