经典算法--字符串倒置

这个就很简单了,直接发代码吧!

#include<iostream>
#include<string>
using namespace std;

string reverse(string s)
{

    for(int i=0,j=s.length()-1;i<j;++i,--j)
    {
        char c=s[i];
        s[i]=s[j];
        s[j]=c;

    }
    return s;
}

int main()
{
    string s="abcdefghijk";
    cout<<reverse(s);
    system("pause");
    return 0;
}

算法很简单,就不细说了。这里要注意的是length和strlen的区别。

两者都是求字符串的长度。

length(“abcd”)的值为5,包含后面的一个’\0’

strlen(“abcd”)的值为4,不计算后面的’\0’

但strlen的参数必须是char*,而s.length()是String类型的对象s的成员方法。所以他们用在不同的地方。

举个例子:

char* ch = “sdsfdsdf”;
String s = “sdsadsd”;
cout<

int strlen(const char *str)
{
   assert(str!=NULL);//断言字符串地址非0
   int len;
   while((*str++)!='\0')
   {
       len++;
   }
   return len;
}

扩展:

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。

例如输入“I am a student.”,则输出“student. a am I”**

算法思想:先颠倒句子中的所有字符。这时,不但翻转了句子中单词的顺序,而且单词内字符也被翻转了。我们再颠倒每个单词内的字符。由于单词内的字符被翻转两次,因此顺序仍然和输入时的顺序保持一致。

以上面的输入为例子。翻转“I am a student.”中所有字符得到“.tneduts a ma I”,再翻转每个单词中字符的顺序得到“students. a am I”,正是符合要求的输出

char* reverse(char* pBegin,char* pEnd)
{
    if(pBegin==NULL||pEnd==NULL)
    {
        return NULL;
    }
    while(pBegin<pEnd)
    {
        char temp=*pBegin;
        *pBegin=*pEnd;
        *pEnd=temp;
        pBegin++;
        pEnd--;

    }
    return pBegin;
}

char* ReverseSetence(char *pData)
{
    if(pData=NULL)
    {
        return NULL;
    }
    char *pBegin=pData;
    char *pEnd  =pData;
    while(*pEnd!='\0')
    {
        pEnd++;
    }
    pEnd--;
    reverse(pBegin,pEnd);
    pBegin=pEnd=pData;
    while(*pBegin!='\0')
    {
        if(*pBegin==' ')
        {
            pBegin++;
            pEnd++;
            continue;
        }
        else if(*pEnd==' '||*pEnd=='\0')
        {
            reverse(pBegin,--pEnd);
            pBegin=++pEnd;
        }
        else
        {
            pEnd++;
        }
    }
    return pData;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值