面试系列5以单词为最小单位翻转字符串-改进版-

来源:软件水平考试    发布时间:2012-11-05    软件水平考试视频    评论

原题:
  以单词为最小单位翻转字符串
  write the function string reversestringwordbyword(string input) that reverses
  a string word by word.  for instance,
  reversestringwordbyword('the house is blue') --> 'blue is house the'
  reversestringwordbyword('zed is dead') --> 'dead is zed'
  reversestringwordbyword('all-in-one') --> 'all-in-one'
面试系列4种的实现,比较费空间,因为多申请了一段空间来保存结果。
在看了其他高手的实现后,发现可以不用申请空间,并且循环的次数更少,也可以实现相同的效果。
大体思路是:
原字符串: the house is blue
先翻转整个字符串-> eulb si esuoh eht
再翻转单个单词。
代码:
/********************************************************************
    created:    2006/06/16
    filename:   c:/documents and settings/administrator/桌面/flwo/reverse2.c
    file path:  c:/documents and settings/administrator/桌面/flwo
    file base:  reverse
    file ext:   c
    author:     a.tng
    version:    0.0.1
   
    purpose:    以单词为最小单位翻转字符串-2 优化版
                write the function string reversestringwordbyword(string input)
                that reverses a string word by word.  for instance,
                reversestringwordbyword('the house is blue') --> 'blue is house the'
                reversestringwordbyword('zed is dead') --> 'dead is zed'
                reversestringwordbyword('all-in-one') --> 'all-in-one'
                参考其他高手的思路:
                先翻转整个字符串-> eulb si esuoh eht
                再翻转单个单词。
*********************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define reverse_word(p1, p2) while (p1 <= p2) /
    { /
        char ch; /
        ch = *p1; *p1 = *p2; *p2 = ch; /
        p1++; p2--; /
    }
/*
 *  name: reverse_src_word_by_word
 *  params:
 *    des           [out]           输出字符串, des 指向实现申请的空间
 *    src           [in]            输入字符串,需要处理的字符串
 *  return:
 *    处理完成后的 des 指针
 *  notes:
 *    以单词为最下单位翻转字符串
 *    优化: 先翻转整个字符串,再翻转单个单词
 * 
 *  author: a.tng 2006/06/16 10:37
 */
char * reverse_str_word_by_word2(char *src)
{
    char   *p1, *p2;
    int     n_src_len;
    if (null == src)
        return null;
    /* 先把整个字符串翻转一次 */
    n_src_len = strlen(src);
    p1 = src; p2 = src + n_src_len - 1;
    reverse_word(p1, p2);
#if 0
    while (p1 <= p2)
    {
        /* 交换头字符和尾字符 */
        char ch;
        ch = *p1; *p1 = *p2; *p2 = ch;
        p1++; p2--;
    }
#endif
    /* 再翻转单个单词 */
    p1 = src; p2 = p1;
    while ('/0' != *p2)
    {
        if (' ' == *p2)
        {
            char   *p;
            p = p2 - 1;
            reverse_word(p1, p);
#if 0          
            while (p1 <= p)
            {
                char ch;
                ch = *p1; *p1 = *p; *p = ch;
                p1++; p--;
            }
#endif
            p2++;
            p1 = p2;
        }
        else
        {
            p2++;
        }
    }
    /* 翻转最后一个单词 */
    p2--;
    reverse_word(p1, p2);
#if 0
    while (p1 <= p2)
    {
        char ch;
        ch = *p1; *p1 = *p2; *p2 = ch;
        p1++; p2--;
    }
#endif
    return src;
}
/*
 *  name: main
 *  params:
 *    none
 *  return:
 *    none
 *  notes:
 *    none
 * 
 *  author: a.tng 2006/06/16 10:37
 */
int main()
{
    // char src[] = ' all-in-one ';
    // char src[] = 'the house is blue';
    char    src[]   = 'zed is dead';
    (void) reverse_str_word_by_word2(src);
    printf('*****%s*****/n', src);
    system('pause');
}

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答