字符串按照单词反序(增加额外空间和不增加额外空间两种实现方法)

将一个字符串按照单词反序,如输入字符串是"I am a programmer", 则输出字符串是"programmer a am I"

输入字符串,两个参数可以表示:char * inStr, int inLen,
输出字符串,不要用返回字符串/指针的方式,而是也用参数,如:char * outStr
如果函数不需要返回,则令其为void

注意,当输入参数包含指针时,请在函数开始部分做非空判断(ASSERT),如ASSERT(inStr != NULL)。
如有必要禁止空字符输入,也可以ASSERT(inLen > 0)

函数名可以由它要完成的功能决定,不确定的时候也可以直接用foo或者fun

综上,本题的函数定义可以是:
void reverse(char * inStr, int inLen, char * outStr)
{
    ASSERT(inStr != NULL && outStr != NULL)
    ...
}

接下来进行算法设计和实现。

in  I am a programmer
start ^         
end  ^         

out  programmer a am I@
outPos                   ^

 

 

 

void reverse(char * inStr, int inLen, char * outStr)
{
    ASSERT(inStr != NULL && outStr != NULL)

    int wordEnd = inLen -1;
    int wordStart = wordEnd;
    int outPos = 0;

    while (true)
    {
        if (intStr[wordStart] == ' ' || wordStart < 0)
        {
            if (wordStart == wordEnd)
            {
                if (wordStart < 0)
                {
                    break;
                }
                wordStart--;
                wordEnd--;
            }
            else
            {
                for (int i=wordStart + 1; i<=wordEnd; i++)
                {
                    outStr[outPos++] = inStr[i];
                }
                if (wordStart < 0)
                {
                    break;
                }
                else
                {
                    outStr[outPos++] = ' ';
                    wordEnd = wordStart;
                }
            }
        }
        else
        {
            wordStart--;
        }
    }
    outStr[outPos] = '/0';
}

 

 

* 如果不增加额外空间,而是在原字符串上反转?

 

#include "stdafx.h"
#include <assert.h>
#include <string.h>

void reverse(char *str, int len);
int _tmain(int argc, _TCHAR* argv[])
{
char str[]="Defines the entry point for the console application";
reverse(str,strlen(str));
printf("%s/n", str);
getchar();


return 0;
}

void reverseWord(char *word, int wordStart, int wordEnd);
void reverse(char *str, int len)
{
assert(str!=NULL);
char * wordStart;
char * wordEnd;
wordStart = wordEnd = str;

while(true)
{
if (*wordEnd == ' ' || *wordEnd == '/0')
{
if (wordStart != wordEnd)
{
reverseWord(str, wordStart-str, wordEnd-1-str);

}
if (*wordEnd == '/0')
{
break;
}
wordEnd ++;
wordStart = wordEnd;
}
else
{
wordEnd++;
}
}

reverseWord(str, 0, len-1);
}

void reverseWord(char *word, int wordStart, int wordEnd)
{
for(char * left = word+wordStart; left < word + wordStart + (wordEnd-wordStart+1)/2; left ++)
{
char * right = word + wordEnd - (left -word - wordStart);
char temp = *left;
*left = *right;
*right = temp;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值